我正在学习为Android应用程序实现Firebase实时数据库。在其中一个片段中,我试图检索表中的所有用途。"users"当有人注册时,Node自动生成。对于注册,我使用FirebaseAuth。
每个用户都是在注册后创建的。我的users表中有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.
换句话说,当我以用户身份登录时,我无法看到在我之前注册的任何其他用户。如何查看节点中的所有用户?
实时数据库是这样的:
{
"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"
}
}
}
有两种方法可以解决这个问题。第一种方法是创建一个POJO类:
class User {
public String email, mobile, name, online, photo;
}
并在您的"用户"中映射每个孩子。node节点转换为User类型的对象。所以请尝试下面的代码行:
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中的结果将是所有用户的名称。