【问题标题】:How to separate a database by sections? in Firebase如何按部分分隔数据库?在 Firebase 中
【发布时间】:2017-04-04 18:32:43
【问题描述】:

大家好,大家好,我有一个问题,我需要将我的数据库与 Firebase 部分分开,然后我的应用就像一个“博客”,需要用“文化”“食物”或事物等部分分开像这样,我只想让一个部分仅显示该部分,而在另一个部分中仅显示该部分中发布的内容

如果您给我指示,我不知道该怎么做会很有帮助 感谢您的关注

参考代码:

 // USER REFERENCES
 public static DatabaseReference getUserRef(String email) {
    return FirebaseDatabase.getInstance()
            .getReference("Userrs")
            .child(email);
}
public static FirebaseUser getCurrentUser() {
    return FirebaseAuth.getInstance().getCurrentUser();
}


// POSTS REFERENCES
public static DatabaseReference getPostRef() {
    return FirebaseDatabase.getInstance()
            .getReference("PostKeys");
}
public static Query getPostQuery() {
    return getPostRef().orderByChild("TimeCreatedKey");
}
public static DatabaseReference getMyPostRef() {
    return FirebaseDatabase.getInstance().getReference("MyPosts")
            .child(getCurrentUser().getEmail().replace(".", ","));
}



 // USER ID
  public static String getUid() {
    String path = FirebaseDatabase.getInstance().getReference().push().toString();
    return path.substring(path.lastIndexOf("/") + 1);
}



// RECORD

public static DatabaseReference getMyRecordRef() {
    return FirebaseDatabase.getInstance().getReference(Constants.USER_RECORD)
            .child(getCurrentUser().getEmail().replace(".", ","));
}



public static void addToMyRecord(String node,final String id) {
    FirebaseUtils.getMyRecordRef().child(node).runTransaction(new Transaction.Handler() {
        @Override
        public Transaction.Result doTransaction(MutableData mutableData) {
            ArrayList<String> myPostCollection;
            if (mutableData.getValue() == null) {
                myPostCollection = new ArrayList<>(1);
                myPostCollection.add(id);
                mutableData.setValue(myPostCollection);
            } else {
                myPostCollection = (ArrayList<String>) mutableData.getValue();
                myPostCollection.add(id);
                mutableData.setValue(myPostCollection);
            }
            return Transaction.success(mutableData);
        }

        @Override
        public void onComplete(DatabaseError databaseError, boolean b, DataSnapshot dataSnapshot) {

        }
    });
}

thw JSON 存档:

   {
  "commentsVideos" : {
  "Jojo" : {
    "-KgonW-KMeWxS-JZQA7k" : {
      "commentIdV" : "-KgonW-KMeWxS-JZQA7k",
      "commentV" : "Jajajaja",
      "timeCreatedV" : 1491239572095
     },
     "-KgpnaW3_QisX7LSjE9T" : {
       "commentIdV" : "-KgpnaW3_QisX7LSjE9T",
       "commentV" : "Alohaaaaa",
      "timeCreatedV" : 1491256371764
    }
   }
  },
    "my_posts" : {
    "a@a,com" : {
    "-KggY-LUpys-0ZOhy8zn" : true,
    "-Kgl9aYUKSRL72TcILtQ" : true,
   "-KgonvtLrtYGQJlnmpO6" : true,
   "-Kgpb14DgJ2qD6wWU8XM" : true
   }
   },
  "my_postsVideos" : {
   "a@a,com" : {
    "-Kgkva-UzSRa0Q-Ohhy7" : true,
   "-Kgkyf0TLujgvJ8OzZHc" : true,
   "-Kgl6QrqVFxMy4COu-kX" : true
   }
  },
  "posts" : {
   "-KggY-LUpys-0ZOhy8zn" : {
    "numComments" : 0,
    "numDislikes" : 0,
     "numLikes" : 0,
     "postId" : "-KggY-LUpys-0ZOhy8zn", 
   "postImageUrl" : "post_images/image:49653",
    "postText" : "Jojo",
   "timeCreated" : 1491101025777
  },
  "-Kgl9aYUKSRL72TcILtQ" : {
     "numComments" : 0,
    "numDislikes" : 0,
    "numLikes" : 1,
     "postId" : "-Kgl9aYUKSRL72TcILtQ",
    "postImageUrl" : "post_images/image:49651",
     "postText" : "Xd",
    "timeCreated" : 1491178516317
  },
  "-KgonvtLrtYGQJlnmpO6" : {
    "numComments" : 0,
   "numDislikes" : 0,
   "numLikes" : 0,
    "postId" : "-KgonvtLrtYGQJlnmpO6",
     "postImageUrl" : "post_images/image:50614",
    "postText" : "Xd",
   "timeCreated" : 1491239682259
    },
   "-Kgpb14DgJ2qD6wWU8XM" : {
    "numComments" : 0,
     "numDislikes" : 0,
     "numLikes" : 0,
     "postId" : "-Kgpb14DgJ2qD6wWU8XM",
     "postImageUrl" : "post_images/image:50624",
   "postText" : "Xdxd",
    "timeCreated" : 1491253076830
   }
  },
 "postsV" : {
  "-Kgkva-UzSRa0Q-Ohhy7" : {
   "numCommentsV" : 0,
   "numDislikesV" : 0,
   "numLikesV" : 0,
    "postIdV" : "Jojo",
   "postVideoUrl" : "post_videos/40925",
    "timeCreatedV" : 1491174581878
  },
 "-Kgkyf0TLujgvJ8OzZHc" : {
   "numCommentsV" : 0,
   "numDislikesV" : 0,
   "numLikesV" : 0,
   "postIdV" : "Juju",
   "postVideoUrl" : "post_videos/40923",
   "timeCreatedV" : 1491175388835
  },
   "-Kgl6QrqVFxMy4COu-kX" : {
   "numCommentsV" : 0,
   "numDislikesV" : 0,
   "numLikesV" : 0,
   "postIdV" : "Jajajaj",
   "postVideoUrl" : "post_videos/40925",
   "timeCreatedV" : 1491177686056
  }
},
"posts_dislikeds" : {
  "a@a,com" : {
    "-KggY-LUpys-0ZOhy8zn" : true,
    "-Kgpb14DgJ2qD6wWU8XM" : true,
    "Juju" : true
  }
},
"posts_liked" : {
 "a@a,com" : {
  "-KggY-LUpys-0ZOhy8zn" : true,
  "-Kgpb14DgJ2qD6wWU8XM" : true
 }
 },
"posts_likedVideos" : {
"a@a,com" : {
  "Jajajaj" : true,
  "Jojo" : true,
  "Juju" : true
 }
 },
 "user_record" : {
 "a@a,com" : {
   "commentsVideos" : [ "-KgonW-KMeWxS-JZQA7k", "-KgpnaW3_QisX7LSjE9T" ],
   "posts" : [ "-KggY-LUpys-0ZOhy8zn", "-Kgl9aYUKSRL72TcILtQ", "-            KgonvtLrtYGQJlnmpO6", "-Kgpb14DgJ2qD6wWU8XM" ]
}
},
"user_recordVideos" : {
 "a@a,com" : {
  "postsV" : [ "-Kgkva-UzSRa0Q-Ohhy7", "-Kgkyf0TLujgvJ8OzZHc", "- Kgl6QrqVFxMy4COu-kX" ]
}
}

}

【问题讨论】:

    标签: android json firebase firebase-realtime-database


    【解决方案1】:

    您想要做的事情可以分 3 步完成,为您的对象添加一个类别,为其编制索引,通过 orderBy 和 equalsTo 查询。新的属性类别将允许您执行仅检索满足条件的对象的查询。然后,索引将加速 Firebase 响应过程,如果您不索引它,您将在控制台中看到一条消息询问您。然后你正在做的查询可以放在任何Activity或Fragment中。

    1.- 将属性添加到您的对象:

    "posts" : {
       "-KggY-LUpys-0ZOhy8zn" : {
        "numComments" : 0,
        "numDislikes" : 0,
        "numLikes" : 0,
        "postId" : "-KggY-LUpys-0ZOhy8zn", 
        "postImageUrl" : "post_images/image:49653",
        "postText" : "Jojo",
        "timeCreated" : 1491101025777,
       "category": "food"
      }
    }
    

    2.- 索引应该类似于

    {
      "rules": {
        ".read": "auth != null",
        ".write": "auth != null",
          "posts": {
          ".indexOn": ["category"]
        }
      }
    }
    

    3.- reference.orderByChild("category").equalTo("food")

    我认为将节点“帖子”按类别分开不是一个好主意,例如“帖子-食物”、“帖子-文化”,因为如果博客增长,那么您将需要检索所有帖子按其他属性,如创作或最喜欢等。

    我在 cmets 中被问到更多细节,所以:

    1. 如果您想要查看的部分之前有任何内容,请添加 onClickListener 指向通向下一部分的项目。代替 它添加了一个“startActivity”传递和“Intent”,其中必须包含 'putExtra' 所以在附加部分中,部分名称将被传递
    2. 然后在下一个 Activity 中使用“getExtras()”获取额外内容并通过 上面“参考”的额外内容 reference.orderByChild("category").equalTo(extraCategory)
    3. 在这里你应该添加一个'addValueEventListener'到'reference' documentation 对此进行了报道
    4. 在“ValueEventListener”中,您必须反映 “数据快照”到您的模型
    5. 使用该数据,填充回收站视图或任何 UI

    【讨论】:

    • Hola @cutiko a lo que me refiero es, que como lo implemento digamos estoy en un navigation view y digamos al dar un click necesito que vaya a una seccion, puedo usar el codigo que me diste en el第 3 步?
    • 我将在答案中添加它
    • 谢谢,最后一个问题,如果我希望引用以这种方式更改它可以吗?
    • { "rules": { ".read": true, ".write": true, "posts":{ ".indexOn":["category"] }, "postsV":{ ".indexOn":["categoryV"] } } }
    • 对我来说似乎不正确,索引内的索引?为什么? Firebase 节点最简单,最多嵌套 2 个。在该示例中,每个用户都可以读取和写入,即使他们没有登录
    猜你喜欢
    • 1970-01-01
    • 2017-07-06
    • 2019-01-29
    • 1970-01-01
    • 2018-01-20
    • 2013-11-27
    • 2018-04-09
    • 2020-03-27
    • 1970-01-01
    相关资源
    最近更新 更多