You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.28 10:27:05