我具有以下数据库结构-
{
"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执行另一查询?