Firebase:根据另一个节点中的字段从节点获取特定字段

时间:2018-04-11 12:20:23

标签: android firebase firebase-realtime-database

我从3小时开始一直在谷歌搜索,但是无法正确地说出搜索词,或者没有好的解决方案。我在我的Android应用程序中使用firebase。它有如下结构: firebase db 上面一个是注释节点

我刚刚使用listview显示了评论。

commentRef1= FirebaseDatabase.getInstance().getReference().child("Comments").child(postKey1);
        commentRef1.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                if(dataSnapshot.exists()){
                    for(DataSnapshot ds: dataSnapshot.getChildren()){
                        comment1=ds.getValue(Comment.class);
                        arrayList.add(comment1);
                    }
                    commentList.setAdapter(adapter);
                }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
        });
    }

但是与每个关系数据库一样,我试图在注释(表)或节点(而不是整个用户名)中保存id或uid。

但是,现在我在显示来自用户节点的注释(即显示名称)时遇到问题查询或显示USERNAME,因为uid仅保存在注释节点中。

我发现了一些方法,比如做嵌套的oneventlistener等等,但是对它的复杂性和努力有点困惑。 它可以是任何sql语言中的简单查询或嵌套选择。

有人可以帮忙吗?如何在该查询中检索用户名或特定值。我看到很多人在评论表中存储了while用户名。我不认为这是正确的做法。

1 个答案:

答案 0 :(得分:1)

要获取full_name,您需要执行以下操作:

 DatabaseReference ref=FirebaseDatabase.getInstance().getReference();
commentRef1= FirebaseDatabase.getInstance().getReference().child("Comments").child(postKey1);
    commentRef1.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            if(dataSnapshot.exists()){
                for(DataSnapshot ds: dataSnapshot.getChildren()){
                    String userid=ds.child("uid").getValue().toString();
                   ref.child("Users").orderByKey().equalTo(userid).addValueEventListener(new ValueEventListener() {
                    @Override
                    public void onDataChange(DataSnapshot dataSnapshot) {
                      String fullname=dataSnapshot.child("full_name").getValue().toString();
                     }
                      @Override
                     public void onCancelled(DatabaseError databaseError) {

                          }
                       });    
                  }
              }
          }

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

您可以使用嵌套侦听器,我想您希望用户键入注释然后单击按钮并使用uid,post_id,comment为评论创建节点。

然后你想要检索注释以显示信息,因此数据快照将在Comments/postKey1上,然后你可以在那里检索信息(包括uid),然后使用orderByKey().equalTo(userid)能够从节点Users

中检索用户的全名

要避免所有这一切,只需在fullname节点中添加Comments而不是userid

https://firebase.googleblog.com/2013/04/denormalizing-your-data-is-normal.html