我正在运行一个运行中的android应用程序,我使用firebase来存储信息。
我有一个节点Users
,其中包含用户的所有信息(年龄,电子邮件,姓名等)。
然后我有一个节点Friends
,在其中存储每个用户的朋友列表。
最后,一个节点RaceInfo
,每个用户的所有种族都存储在userId下。
我想显示用户朋友最近比赛的信息。我的方法是:
(我想按从最新到最旧的顺序排序。但是我认为不可能检索所有朋友的所有种族然后再对他们进行订购,因为种族数量可能很大)
如何执行步骤1和2?
因为首先我需要一个ValueEventListener来获取ID,然后再次需要一个valueEventListener来获取User,并且这些操作是异步的。
public void loadFollowers(){
final List<User> usersList = loadUsers();
//we should wait until all users are load from the data base
final List<User> followersList = new ArrayList<>();
DatabaseReference followersRef = FirebaseDatabase.getInstance().getReference(Constants.FOLLOWERS).child(userId1);
followersRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
for(DataSnapshot ds: dataSnapshot.getChildren()){
for(User u: usersList) {
if (ds.getValue().toString().equals(u.userid)){ //Es amigo
Log.i("amigo", u.userid);
}
}
}
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
}
private List<User> loadUsers() {
final List<User> usersList = new ArrayList<>();
DatabaseReference allUsersRef = FirebaseDatabase.getInstance().getReference().child(Constants.USERS);
allUsersRef.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
usersList.clear();
for(DataSnapshot ds : dataSnapshot.getChildren()){
User user = ds.getValue(User.class);
if(!user.getUserid().equals(firebaseUser.getUid())){
usersList.add(user);
}
}
users.setValue(usersList);
}
@Override
public void onCancelled(@NonNull DatabaseError databaseError) {
}
});
return usersList;
}
在loadFollowers()
中看到我正在使用loadUsers()
。我应该先等loadUsers()
。
除了不检索所有种族之外,我该如何执行第1步和第3步?