处理异步Firebase数据库

时间:2020-05-10 22:19:36

标签: android firebase firebase-realtime-database

我正在运行一个运行中的android应用程序,我使用firebase来存储信息。 我有一个节点Users,其中包含用户的所有信息(年龄,电子邮件,姓名等)。

然后我有一个节点Friends,在其中存储每个用户的朋友列表。 最后,一个节点RaceInfo,每个用户的所有种族都存储在userId下。

Figure 1

我想显示用户朋友最近比赛的信息。我的方法是:

  1. 在ID向量中检索用户的所有朋友ID。
  2. 遍历数据库中的“用户”节点并比较ID。如果是朋友,则将其添加到朋友列表中。
  3. 遍历数据库中的RaceInfo节点并比较ID。如果是朋友,则将ir添加到比赛列表中。

(我想按从最新到最旧的顺序排序。但是我认为不可能检索所有朋友的所有种族然后再对他们进行订购,因为种族数量可能很大)

如何执行步骤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步?

0 个答案:

没有答案