Firebase获取子列表的子项

时间:2016-09-23 13:35:09

标签: android firebase firebase-realtime-database

我已经创建了一个ListView,它应该显示存在的firebase用户的所有用户名。但是现在我遇到了一个问题,我不知道如何获得用户ID的孩子。当然我可以在数据库中创建一个带有ID的数组,但如果有更多的人在应用程序上注册,它就不会自动执行。所以你知道如何让孩子的所有孩子?看起来像这样

Root
   iadf09f08asd0fasd
      Infos
         Username: LeagueHans
   i297f9pb2f92
       Infos 
         Username: Julian
   08bfbüqw0efü
       Infos
         Username: Markus

来自评论:

DatabaseReference root = FirebaseDatabase.getInstance().getReference();
root.child("Users")‌​.child(What to write here).child("Infos").child("Username"); 

我不知道如何将小孩(iadf09f08asd0fasd)作为孩子。

2 个答案:

答案 0 :(得分:2)

当您对某个位置运行查询时,您将立即获得该位置下的节点子集。你不能在那之下检索较低级别的孩子。

因此,要么您必须检索所有数据,然后只需处理客户端的用户名,或者(最好)您需要更改数据模型以更好地适应您的用例。

仅使用用户名

root.child("Users")‌​.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildName) {
        String username = snapshot.child("Infos/Username).getValue(String.class);
    }
    ...

这将有效,但意味着您要检索的数据超出了您的需要。这是Firebase建议您不嵌套数据的众多原因之一,除非您始终需要组合数据。

替代方案是:

使用与您的用例

匹配的数据模型

我经常建议您在Firebase中为应用的屏幕建模。因此,如果要在应用程序中显示用户名列表,则应在数据库中保留用户名列表:

Usernames
   iadf09f08asd0fasd: "LeagueHans"
   i297f9pb2f92: "Julian"
   08bfbüqw0efü: "Markus"

现在您可以使用以下命令获取用户名:

root.child("Usernamess")‌​.addChildEventListener(new ChildEventListener() {
    @Override
    public void onChildAdded(DataSnapshot snapshot, String previousChildName) {
        String username = snapshot.getValue(String.class);
    }
    ...

答案 1 :(得分:0)

试试这个......

每当数据库发生变化时,firebase addValueEventListener都会触发,因此请使用它来检索数据。

mReference.child("Root").child("Infos").addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {

            for (DataSnapshot eventSnapshot : dataSnapshot.getChildren()) {

                YourModel mModel = eventSnapshot.getValue(YourModel.class);
                Log.e("NAME " ,""+ mModel);

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });