Firebase嵌套的ValueEventListener

时间:2019-11-17 11:44:42

标签: android firebase firebase-realtime-database

我具有以下数据库结构-

 {
      "linking" : {
        "shift-assign" : { // for every shift its assigned users
          "key1" : {
            "111" : true,
            "222" : true
          },
          "key2" : {
            "111" : true
          }
        },
        "user-assign" : { // for every user its assigned shifts
          "111" : {
            "key1" : true,
            "key2" : true
          },
          "222" : {
            "key1" : true
          }
        }
      },
      "shifts" : {
        "20191117" : {
          "key1" : {
            "endTime" : "00:00",
            "numOfEmps" : 3,
            "startTime" : "00:00",
            "wage" : 0
          },
          "key2" : {
            "endTime" : "00:00",
            "numOfEmps" : 1,
            "startTime" : "00:00",
            "wage" : 0
          }
        }
      },
      "users" : {
        "111" : {
          "id" : "111",
          "password" : "111"
          },
        "222" : {
          "id" : "222",
          "password" : "222"
        },
        "99999" : {
          "id" : "99999",
          "password" : "123",
        }
      }
    }

可以将一个用户分配给多个班次,一个班次可以包含多个用户。

我目前正在尝试获取分配给特定班次的所有用户。

因此,想法是将ValueEventListener附加到linking/shift-assign/{shift-key},运行一个循环,并为每个user-key引用users/{user-key}并附加一个内部ValueEventListener以进行读取用户对象并将其添加到userList

类似这样的东西:

mDatabase.child("linking/shift-assign").child(shiftKey)
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot dataSnapshot) {
                    if(dataSnapshot.exists()){
                        for(DataSnapshot ds : dataSnapshot.getChildren()){

                            mDatabase.child("users").child(ds.getKey())
                                    .addValueEventListener(new ValueEventListener() {
                                        @Override
                                        public void onDataChange(@NonNull DataSnapshot dataSnapshot2) {
                                            mUser user = dataSnapshot2.getValue(mUser.class);
                                            userList.add(user);
                                        }

                                        @Override
                                        public void onCancelled(@NonNull DatabaseError databaseError) {}
                                    });
                        }
                        adapter = new UsersAssignedAdapter(UsersAssignedActivity.this, userList);
                        lv.setAdapter(adapter);
                    }
                }

                @Override
                public void onCancelled(@NonNull DatabaseError databaseError) {}
            });

我调试了它,发现for循环在调用内部ValueEventListener之前完成了,这就是为什么我在适配器中得到一个空列表的原因。我猜这是由于它的异步行为。

所以我的问题是-有什么办法可以查询所有用户ID,并为每个用户ID执行另一查询?

0 个答案:

没有答案