Android 从firebase的2个表中获取列表数据

Android 从firebase的2个表中获取列表数据,android,firebase-realtime-database,Android,Firebase Realtime Database,好的,我有这样的数据结构 评论活动:{ 事件1:{ 0:{ 用户:1 } 1:{ 用户:3 } } 事件2:{ 0:{ 用户:2 } 1:{ 用户:3 } } } 用户:{ 1:{ 姓名:詹姆斯 } 2:{ 姓名:金 } 3:{ 姓名:露娜 } } 我想根据Event1的注释获得一个名称列表,我尝试编写代码 List<String> name = new ArrayList<>(); String eventID = 1; DatabaseRefere

好的,我有这样的数据结构

评论活动:{

  • 事件1:{

    • 0:{ 用户:1 }
    • 1:{ 用户:3 }
    }

  • 事件2:{

    • 0:{ 用户:2 }
    • 1:{ 用户:3 }
    }

}

用户:{

  • 1:{ 姓名:詹姆斯 }
  • 2:{ 姓名:金 }
  • 3:{ 姓名:露娜 } }
我想根据Event1的注释获得一个名称列表,我尝试编写代码

List<String> name = new ArrayList<>();
String eventID = 1;
DatabaseReference firebaseDatabase = FirebaseDatabase.getInstance().getReference();
        firebaseDatabase.child("CommentEvent/Event"+eventID).addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(@NonNull DataSnapshot snapshot) {
                for (DataSnapshot item : snapshot.getChildren()){
                    String uID = String.valueOf(item.child("User").getValue());

                    firebaseDatabase.child("User").child(uID).addValueEventListener(new ValueEventListener() {
                        @Override
                        public void onDataChange(@NonNull DataSnapshot snapshot) {
                             name.add(String.valueOf(snapshot.child("Name").getValue()));
                             // I check here the list 'name' is still fine, The size of 'name' is increased
                        }


                        @Override
                        public void onCancelled(@NonNull DatabaseError error) {

                        }
                    });


                }


            }
            // But here i check again. The size of 'name' is still 0
            @Override
            public void onCancelled(@NonNull DatabaseError error) {

            }
        });
List name=new ArrayList();
字符串eventID=1;
DatabaseReference firebaseDatabase=firebaseDatabase.getInstance().getReference();
firebaseDatabase.child(“CommentEvent/Event”+eventID).addValueEventListener(新的ValueEventListener(){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
对于(DataSnapshot项:snapshot.getChildren()){
String uID=String.valueOf(item.child(“用户”).getValue());
firebaseDatabase.child(“用户”).child(uID).addValueEventListener(新的ValueEventListener()){
@凌驾
public void onDataChange(@NonNull DataSnapshot snapshot snapshot){
name.add(String.valueOf(snapshot.child(“name”).getValue());
//我在这里检查列表“name”仍然很好,“name”的大小增加了
}
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
}
}
//但我在这里再次检查。“name”的大小仍然是0
@凌驾
已取消公共void(@NonNull DatabaseError){
}
});
我的问题在于代码中的注释//处。
有人帮忙吗?

您看到的是预期的行为。数据是从Firebase(和大多数云API)异步加载的,这可能需要一些时间。加载数据时,主/包含代码将继续执行,以便用户可以继续使用应用程序。然后,当数据可用时,您的
onDataChange
将与数据一起调用。这在实践中意味着,任何需要数据的代码都需要位于该数据的
onDataChange
内部,或者从那里调用。看见