【问题标题】:Retrieving all users from Firebase RealtimeDatabase从 Firebase 实时数据库中检索所有用户
【发布时间】:2021-11-02 08:23:09
【问题描述】:

我正在学习为 Android 应用实施 Firebase 实时数据库。在其中一个片段中,我试图检索表中的所有用途。当有人注册时,“用户”节点会自动生成。对于注册,我使用的是 FirebaseAuth。

每个用户都是在注册后创建的。我的用户表中有 4 个用户:

1. TestUser1
2. TestUser2
3. TestUser3
4. TestUser4

每个用户都有姓名、电子邮件、手机、在线状态和照片。我正在使用以下代码:

Query query = dbReference.orderByChild(NodeNames.NAME);
        query.addValueEventListener(new ValueEventListener() {
            @SuppressLint("NotifyDataSetChanged")
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                findFriendsModelList.clear();

                for (DataSnapshot ds : snapshot.getChildren()) {
                    String userId = ds.getKey();
                    if (userId.equals(currentUser.getUid()))
                        return;
                    if (ds.child(NodeNames.NAME).getValue()!=null) {
                        String fullName = ds.child(NodeNames.NAME).getValue().toString();
                        String photoName = ds.child(NodeNames.PHOTO).getValue().toString();

                        findFriendsModelList.add(new FindFriendsModel(fullName,photoName,userId,false));
                        findFriendsAdapter.notifyDataSetChanged();
                        tvFindFriends.setVisibility(View.GONE);
                        progressBar.setVisibility(View.GONE);


                    }


                }

            }

            @Override
            public void onCancelled(@NonNull DatabaseError error) {
                progressBar.setVisibility(View.GONE);
                Toast.makeText(getContext(), getContext().getString(R.string.failed_to_fetch_friends,error.getMessage()), Toast.LENGTH_SHORT).show();

            }
        });

当 Android 从表中获取数据时,数据会按照用户名的创建顺序为每个用户递增。

例如:

我将 TestUser1 注册为第一个用户,然后是 testuser2、TestUser3 和 TestUser4。

当我以 TestUser1 身份登录时,我可以看到 TestUser2、TestUser3 和 TestUser4

Login as TestUser1 --> can see --> All other users
Login as TestUser2 --> can see only --TestUser3 & TestUser4.
Login as TestUser3 --> can see only --> TestUser4
Login as TestUser4 --> can see only --> ProgressBar.

换句话说,当我以用户身份登录时,我无法看到在我之前注册的任何其他用户。如何查看节点中的所有用户?

Realtime dDtabase 是这样的:

{
  "Users" : {
    "H4remW9oKDe5iWN74KT5jTHZk1S2" : {
      "email" : "tuser4@gmail.com",
      "mobile" : "1234567890",
      "name" : "TestUser4",
      "online" : "true",
      "photo" : "/v0/b/aivu-a1380.appspot.com/o/images/H4remW9oKDe5iWN74KT5jTHZk1S2.jpg"
    },
    "N0Rx9r71PubzzWkO8YXFABuNZNL2" : {
      "email" : "tuser3@gmail.com",
      "mobile" : "1234567891",
      "name" : "TestUser3",
      "online" : "true",
      "photo" : "/v0/b/aivu-a1380.appspot.com/o/images/N0Rx9r71PubzzWkO8YXFABuNZNL2.jpg"
    },
    "V1AJt2vWOmNKrBzu6EOFdm4aXdI3" : {
      "email" : "tuser1@gmail.com",
      "mobile" : "1234567892",
      "name" : "Sujatha",
      "online" : "true",
      "photo" : "/v0/b/aivu-a1380.appspot.com/o/images/V1AJt2vWOmNKrBzu6EOFdm4aXdI3.jpg"
    },
    "iymUckwHCucx7t4b8mdCkSrqzS22" : {
      "email" : "tuser2@gmail.com",
      "mobile" : "1234567894",
      "name" : "TestUser 2",
      "online" : "true",
      "photo" : "/v0/b/aivu-a1380.appspot.com/o/images/iymUckwHCucx7t4b8mdCkSrqzS22.jpg"
    }
  }
}

【问题讨论】:

  • 请编辑您的问题并将您的数据库结构添加为 JSON 文件,而不是描述您的数据库的外观。您可以通过单击 Firebase Console 的溢出菜单 (⠇) 中的导出 JSON 来简单地获取它。还请说明您希望获得或限制什么?
  • @AlexMamo。谢谢你。我已将儿子添加到问题中。我想获得所有用户。

标签: java android firebase firebase-realtime-database google-cloud-platform


【解决方案1】:

有两种方法可以解决这个问题。第一种方法是创建一个 POJO 类:

class User {
    public String email, mobile, name, online, photo;
}

并将“用户”节点节点中的每个子节点映射到用户类型的对象。所以请尝试以下代码行:

DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference usersRef = rootRef.child("users");
usersRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot ds : task.getResult().getChildren()) {
                User user = ds.getValue(User.class);
                Log.d("TAG", user.name);
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

或者,您可以单独获取每个属性:

usersRef.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot ds : task.getResult().getChildren()) {
                String email = ds.child("email").getValue(String.class);
                String mobile = ds.child("mobile").getValue(String.class);
                String name = ds.child("name").getValue(String.class);
                String online = ds.child("online").getValue(String.class);
                String photo = ds.child("photo").getValue(String.class);
                Log.d("TAG", name);
            }
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

在这两种情况下,logcat 中的结果都是所有用户的名称。

【讨论】:

  • 嘿杏。我可以帮助您了解其他信息吗?如果您认为我的回答对您有所帮助,请考虑采纳(✔️)。我真的很感激。谢谢!
猜你喜欢
  • 1970-01-01
  • 2019-05-24
  • 2019-04-16
  • 2020-12-09
  • 2020-09-18
  • 1970-01-01
  • 1970-01-01
  • 2021-02-06
  • 1970-01-01
相关资源
最近更新 更多