【问题标题】:Firebase deep query OrderByChild equalTo AndroidFirebase 深度查询 OrderByChild equalTo Android
【发布时间】:2017-03-26 13:03:13
【问题描述】:

我正在使用 Firebase 数据库创建评论应用,

每个用户都有个人资料(显示名称、图像、年龄和性别),我允许用户更改他们的个人资料名称和图像,但是,当用户更改名称时,所有帖子评论都会保留旧名称(不妥,我没有更改它们),因此,我创建了一个每次用户更改名称时运行的方法 -

    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);
                                                    }
                                                }
             });

它的工作就像一个魅力,但是,我的问题是评论-cmets,

如何将它们排序为与我的 UID 相同?

我想我需要像“深度排序”这样的东西

项目结构-

【问题讨论】:

    标签: android firebase firebase-realtime-database


    【解决方案1】:

    Firebase 数据库查询只能对深度一级或固定路径的属性进行排序。因此,您需要扩充您的数据模型以支持此用例。

    最简单的方法是保留从 UID 到他们的 cmets 的映射,这可能对向用户显示他们的所有 cmets 也很有用。它看起来像这样:

    "userComments": {
      "uidOfNirel": {
        "-KfpD...._-Kfpu...": "-KfpD..../-Kfpu..."
      }
    }
    

    因此,该值是特定评论的实际路径,允许您快速重建对每条评论的完整引用。密钥只是路径的编码版本,以确保唯一性而无需生成另一个推送 ID。然后,您将获取用户的所有 cmets 并使用以下命令遍历它们:

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

    【讨论】:

    • 嗯,不喜欢它,但我想现在没有其他方法了..
    猜你喜欢
    • 1970-01-01
    • 2021-12-24
    • 2017-08-22
    • 1970-01-01
    • 2018-08-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多