我正在使用Firebase数据库创建评论应用
每个用户都有个人资料(displayName,图片,年龄和性别),我允许用户更改自己的个人资料名称和图片,但,当用户更改其名称时,所有帖子评论都会保留旧的名字(起初,我没有改变它们),因此,我创建了一个每次用户更改名称时运行的方法 -
mFirebaseDatabaseReference.child("displayName").setValue(newName);
FirebaseDatabase database = FirebaseDatabase.getInstance();
final DatabaseReference dataRef = database.getReference();
dataRef.child("reviews").orderByChild("uid").equalTo(mFirebaseUser.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(final DataSnapshot snapshot) {
for (DataSnapshot data : snapshot.getChildren()) {
data.child("userName").getRef().setValue(newName);
}
}
});
它的工作就像一个魅力,但是,我的问题是评论 - 评论,
如何将它们排序为与我的UID相等?
我想我需要像"深度排序"
项目结构 -
答案 0 :(得分:0)
Firebase数据库查询只能对某个级别的深度或固定路径的属性进行排序。因此,您需要扩充数据模型以允许此用例。
最简单的方法是保持从UID到其注释的映射,这可能对向用户显示所有注释也很有用。它看起来像这样:
"userComments": {
"uidOfNirel": {
"-KfpD...._-Kfpu...": "-KfpD..../-Kfpu..."
}
}
因此,该值是特定注释的实际路径,允许您快速重建对每条注释的完整引用。密钥只是路径的编码版本,以确保唯一性,而不会生成另一个推送ID。然后,您将获得用户的所有评论并使用以下内容循环播放:
dataRef.child("userComments").child(user.getUid()).addListenerForSingleValueEvent(new ValueEventListener() {
public void onDataChange(DataSnapshot snapshot) {
for (DataSnapshot commentSnapshot: snapshot.getChildren()) {
System.out.println(commentSnapshot.getKey());
DatabaseReference commentRef = dataRef.child("reviews-comments").child(commentSnapshot.getValue(String.class));
commentRef.addListenerForSingleValueEvent(...
}
});