我从3小时开始一直在谷歌搜索,但是无法正确地说出搜索词,或者没有好的解决方案。我在我的Android应用程序中使用firebase。它有如下结构: 上面一个是注释节点
我刚刚使用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用户名。我不认为这是正确的做法。
答案 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