2017-03-26 41 views
0

我创建使用火力地堡数据库的审查的程序,火力地堡深查询OrderByChild equalTo的Android

每个用户,都有档案(显示名,形象,年龄和性别),我允许用户更改个人资料名称和图像,,当用户更改其名称的所有帖子的评论保持旧的名称(offcurse,我并没有改变它们),因此,我创建了运行每次用户更改其名称的方法 -

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

回答

0

火力地堡数据库查询只能排序上的属性深度只有一层或在一个固定的路径。所以你需要增加你的数据模型来允许这个用例。

最简单的方法是保持从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(... 
    } 
}); 
+0

嗯,不喜欢它,但我想现在没有任何其他的方式.. – Nirel