如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?

How to create a list of all the saved posts of a particular user using Firebase Realtime Database?

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

这意味着我必须编写一个代码来滚动 'Posts' 节点中的所有 post,检查每个 [=36] 中的 'saves' child =], 如果存在,则检查 'saves' 中特定用户的用户 ID, 如果存在,则应将 post 添加到名为 'mySavedPosts'.

的列表中

Please click here to see the structure of my 'Posts' node.

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

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 种其他修改,但其中 none 行得通。

根据您的评论:

I just need to see if the auth.getUid() is there in the children of "saves".

要检查“saves”节点中是否存在认证用户的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!
        }
    }
});