Firebase深度查询OrderByChild equalTo Android

时间:2017-03-26 13:03:14

标签: android firebase firebase-realtime-database

我正在使用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相等?

我想我需要像"深度排序"

项目结构 -

Project structure

1 个答案:

答案 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(...
  }
});