如何使用Firebase Realtime Database获取特定用户的全部收藏帖子列表
错误原因
你的原代码查询路径不符合实际数据结构:Posts节点的直接子节点是所有由push()生成的帖子唯一ID,saves节点是挂载在每个独立帖子节点下的子节点,你直接通过Posts > saves路径查询,根本无法命中任何有效数据,这是返回空列表的核心原因。
另外你尝试直接拼接post.getPostID()时报空指针,是因为你还没有获取到对应的帖子对象时就调用了该对象的方法,自然会报错。
可行实现代码
// 先校验用户登录状态,避免空指针 FirebaseUser currentUser = FirebaseAuth.getInstance().getCurrentUser(); if (currentUser == null) { // 处理未登录逻辑,比如提示登录后查看收藏 return; } String uid = currentUser.getUid(); FirebaseDatabase.getInstance().getReference() .child("Posts") .addValueEventListener(new ValueEventListener() { @Override public void onDataChange(@NonNull DataSnapshot snapshot) { mySavedPosts.clear(); // 遍历所有帖子节点 for (DataSnapshot postSnapshot : snapshot.getChildren()) { // 检查当前帖子是否有saves节点,且当前用户在saves列表中 if (postSnapshot.child("saves").hasChild(uid)) { Post post = postSnapshot.getValue(Post.class); // 可选:如果你的Post类包含postID字段,可手动赋值 // post.setPostID(postSnapshot.getKey()); mySavedPosts.add(post); } } Collections.reverse(mySavedPosts); postAdapterSaves.notifyDataSetChanged(); } @Override public void onCancelled(@NonNull DatabaseError error) { // 建议打印错误日志方便排查 Log.e("FetchSaves", "查询失败: " + error.getMessage()); } });
性能优化建议
如果你的Posts节点数据量很大,全量遍历所有帖子的查询效率会非常低,还会浪费带宽和读取配额。建议调整数据结构,额外新增一个UserSaves根节点,结构参考如下:
UserSaves ├─ 用户ID1 │ ├─ 帖子ID1: true │ ├─ 帖子ID2: true └─ 用户ID2 ├─ 帖子ID3: true
需要查询用户收藏列表时,先查对应用户下的所有帖子ID,再根据ID批量查询对应的帖子内容,查询效率会有明显提升。
内容的提问来源于stack exchange,提问作者Krishna Jindal
相关产品推荐
相关产品推荐

