首页 > 解决方案 > 如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?

问题描述

我有一个名为“帖子”的根节点。然后 Posts 中的每个节点都有一个由 push() 生成的唯一 postID。现在每个帖子都有几个孩子。一个这样的孩子是“保存”,我在其中存储了保存此特定帖子的那些用户的用户 ID。我想做的是创建并显示特定用户保存的所有帖子的列表。

这意味着我必须编写一个代码来滚动浏览“帖子”节点中的所有帖子,检查每个帖子中的“保存”子项(如果存在),然后检查“保存”中特定用户的用户 ID(如果存在)存在,则应将该帖子添加到名为“mySavedPosts”的列表中。

请单击此处查看我的“帖子”节点的结构。

我尝试了许多不同的方法来实现这一点,但我只是得到一个空列表或应用程序崩溃。我不能发布我尝试过的所有不同方式,因为这会使这个问题变得非常冗长和笨拙,但我所有的方式都围绕着这种方法:

FirebaseDatabase.getInstance().getReference()
            .child("Posts")
            .child("saves")
            .addValueEventListener(new ValueEventListener() {
                @Override
                public void onDataChange(@NonNull DataSnapshot snapshot) {
                    mySavedPosts.clear();
                    if (snapshot.child(FirebaseAuth.getInstance().getCurrentUser().getUid()).exists()){
                        for (DataSnapshot dataSnapshot : snapshot.getChildren()){
                            Post post = dataSnapshot.getValue(Post.class);
                            mySavedPosts.add(post);
                        }
                    }
                    Collections.reverse(mySavedPosts);
                    postAdapterSaves.notifyDataSetChanged();
                }

                @Override
                public void onCancelled(@NonNull DatabaseError error) {

                }
            });

我也尝试在 .child("Posts") 之后输入 .child(post.getPostID()) ,但这会生成空指针异常。我也尝试在 .child("saves") 之后输入 .child(auth.getUid()),但也没有用!我尝试了 10 次其他修改,但都没有奏效。

标签: javaandroidfirebasefirebase-realtime-database

解决方案


根据您的评论:

我只需要看看 auth.getUid() 是否存在于“保存”的孩子中。

要检查经过身份验证的用户的 UID 是否存在于“保存”节点中,请使用以下代码行:

String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference postsRef = rootRef.child("Posts");
Query query = postsRef.orderByChild("saves/" + uid).equalTo(true);
query.get().addOnCompleteListener(new OnCompleteListener<DataSnapshot>() {
    @Override
    public void onComplete(@NonNull Task<DataSnapshot> task) {
        if (task.isSuccessful()) {
            for (DataSnapshot postSnapshot : task.getResult().getChildren()) {
                Post post = postSnapshot.getValue(Post.class);
                mySavedPosts.add(post);
            }
            Collections.reverse(mySavedPosts);
            postAdapterSaves.notifyDataSetChanged();
        } else {
            Log.d("TAG", task.getException().getMessage()); //Don't ignore potential errors!
        }
    }
});

推荐阅读