【问题标题】:Retrieving Current User's DataSnapshot Firebase检索当前用户的 DataSnapshot Firebase
【发布时间】:2017-01-10 01:02:53
【问题描述】:

更新:我决定重新编辑这个问题,以便更好地澄清并使用更集中的代码。

我遇到的问题是我有一个 UserList 对象的 ArrayList,这些对象是从以前的活动中选择的用户,我们称之为selectedUsers。我有另一个对象,我想将 selectedUsers 以及 Firebase 中的当前用户分组到其中。这将被称为mGroupMembers,其中包含 GroupMember 对象。

我能够将selectedUsers 放入mGroupMembers 的ArrayList 中,但我无法将当前用户(由他们的ID 引用)放入所述ArrayList。我认为问题在于 Firebase。不知道为什么当我调用addListenerForSingleValueEvent时,当前用户的数据没有添加到mGroupMembersArrayList中?

这是我的代码:

public class TestActivity extends AppCompatActivity {

    //Tag
    private static String TAG = "TestActivity";

    private List<UserList> selectedUsers;
    private TextView mPickedText;
    private TextView mCurrentText;
    private TextView mMembCountText;
    private List<GroupMembers> mGroupMembers;
    private String memberNames;

    @Override
    protected void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.activity_test);

        //Selected users from previous activity.
        selectedUsers = (List<UserList>) getIntent().getSerializableExtra("users");

        //Text Views
        mPickedText = (TextView) findViewById(R.id.first_text);
        mCurrentText = (TextView) findViewById(R.id.second_text);
        mMembCountText = (TextView) findViewById(R.id.third_text);

        //GroupMembs
        mGroupMembers = new ArrayList<>();

        //Current user.
        final String currentUserID = FirebaseAuth.getInstance().getCurrentUser().getUid();
        DatabaseReference mRef = FirebaseDatabase.getInstance().getReference().child("users").child(currentUserID);
        mRef.addListenerForSingleValueEvent(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                UserList user = dataSnapshot.getValue(UserList.class);
                GroupMembers member;

                //If the current user...
                if (Objects.equals(user.getUid(), currentUserID)) {
                    mCurrentText.setText("Current: " + user.getName());
                    member = new GroupMembers(user.getName(), user.getUsername(), user.getEmail(), user.getUid());

                    Log.d(TAG, "Member object contains...Name: " + user.getName() + "\n" +
                            "Username: " + user.getUsername() + "\n" +
                            "Email: " + user.getEmail() +
                            "uid: " + user.getUid());

                    selectedUsers.add(user);

                    mGroupMembers.add(member);

                    for (GroupMembers members : mGroupMembers) {
                        Log.d(TAG, "Member object contains...Name: " + members.getName() + "\n" +
                                "Username: " + members.getUsername() + "\n" +
                                "Email: " + members.getEmail() +
                                "uid: " + members.getUid());
                    }
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });

        //Picked user.
        for (UserList selected : selectedUsers) {
            GroupMembers member = new GroupMembers();

            member.setName(selected.getName());
            member.setUsername(selected.getUsername());
            member.setEmail(selected.getEmail());
            member.setUid(selected.getUid());

            mGroupMembers.add(member);

            mPickedText.setText("Selected: " + selected.getName());
        }

        for (GroupMembers members : mGroupMembers) {
            memberNames = members.getName();
        }



        mMembCountText.setText("Group Members: " + mGroupMembers.size() + " ");
    }
}

这里是 Firebase 数据库

{
  "users" : {
    "S3l3yRh8TqRYNeTWQ7tKEdUe2K03" : {
      "email" : "antwon@domain.com",
      "name" : "Antwon ",
      "profilePicture" : " ",
      "uid" : "S3l3yRh8TqRYNeTWQ7tKEdUe2K03",
      "username" : "ant01"
    },
    "af7KgxP7QgZT3d6adtgwBRwnsaI2" : {
      "email" : "bill@domain.com",
      "name" : "Bill",
      "profilePicture" : " ",
      "uid" : "af7KgxP7QgZT3d6adtgwBRwnsaI2",
      "username" : "Bill123"
    }
  }
}

当我记录 mGroupMembers ArrayList 时会发生以下情况:

D/TestActivity: Member object contains...Name: Antwon 
                Username: ant01
                Email: antwon@domain.comuid: S3l3yRh8TqRYNeTWQ7tKEdUe2K03
D/TestActivity: Member object contains...Name: Bill
                Username: Bill123
                Email: bill@domain.comuid: af7KgxP7QgZT3d6adtgwBRwnsaI2
D/TestActivity: Member object contains...Name: Antwon 
                Username: ant01
                Email: antwon@domain.comuid: S3l3yRh8TqRYNeTWQ7tKEdUe2K03

正在添加当前用户(Antwon),但为什么我运行程序时没有显示?现在程序只显示所选用户的名称以及当前用户的名称。然后它显示mGroupMembers 的大小。大小当然只有 1,而应该是 2。

【问题讨论】:

  • 您已在问题中包含指向 JSON 树图片的链接。请将其替换为实际的 JSON 作为文本,您可以通过单击 your Firebase Database console 中的导出 JSON 链接轻松获得。将 JSON 作为文本使其可搜索,让我们可以轻松地使用它来测试您的实际数据并在我们的答案中使用它,一般来说这只是一件好事。
  • 感谢您让我知道这一点,我现在已经编辑了它@FrankvanPuffelen
  • 您的问题描述与您发布的代码不一致。你说:我决定尝试调试selectedUsers.add(mCurrentUsers)。该声明不在发布的代码中。
  • 在添加监听器之前尝试在 onCreate 方法上初始化 newRef 和 currentUserId
  • 我试过了,没有运气@RosárioPereiraFernandes

标签: android firebase android-recyclerview firebase-realtime-database


【解决方案1】:

意外行为是 Firebase 侦听器的异步特性造成的。在从 Firebase 服务器检索数据快照之前,onDataChange() 不会执行。这通常需要几毫秒,并且会在添加侦听器之后的语句之后发生。对于您的代码,此 for 语句在 onDataChange() 触发并添加当前用户之前执行:

    //Picked user.
    for (UserList selected : selectedUsers) {
        GroupMembers member = new GroupMembers();

        member.setName(selected.getName());
        member.setUsername(selected.getUsername());
        member.setEmail(selected.getEmail());
        member.setUid(selected.getUid());

        mGroupMembers.add(member);

        mPickedText.setText("Selected: " + selected.getName());
    }

this answer 中提供了有关 Firebase 异步加载数据的进一步说明。

【讨论】:

  • 那么我应该在for循环之前添加一个进度对话框吗?或者你认为我应该怎么做才能及时检索数据库快照?编辑:刚刚看到你的链接,谢谢。
猜你喜欢
  • 1970-01-01
  • 2019-05-03
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-02-12
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多