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

标签 java 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。

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

我发现了一些方法,例如嵌套 oneventlistener 等,但对它的复杂性和所需的努力有点困惑。 这将是任何 SQL 语言中的简单查询或嵌套选择。

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

最佳答案

要获取 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

检索用户的全名

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

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

关于java - Firebase:根据另一个节点中的字段从一个节点获取特定字段,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49774987/

相关文章:

java - 使用 Axon 4 从 AMQP 接收事件

java - 使用 https(SSL 的自签名证书)连接到 VPS 上的解析服务器

java - 无法使用 Robotium 与屏幕中的所有 TextView 进行交互

java - 如何使用java中的 `PEM`编码文件配置kafka进行TLS通信

java - 通过 xrdp 登录时清除 LD_LIBRARY_PATH

android - 如何仅同步 android 2.2 froyo 代码?

Firebase 函数 : setup Admin Sdk without service-account. json 文件

firebase - 在没有互联网连接的情况下使用 Firebase 模拟器

android - "Need login credentials for app review"对于只有手机号码作为登录选项的应用程序

java - proguard-rules.pro 文件上的 FileNotFoundException