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

Posted

技术标签:

【中文标题】如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?【英文标题】:How to create a list of all the saved posts of a particular user using Firebase Realtime Database? 【发布时间】:2021-12-16 00:50:53 【问题描述】:

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

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

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

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

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 次其他修改,但都没有奏效。

【问题讨论】:

为了更好地理解,是否需要获取“saves”下存在的所有数据?如果是,您在变量中保存的对象中是否有任何数据,例如推送的 ID? @AlexMamo 是的,Alex,我确实需要访问“保存”下的所有数据。看,“保存”下的数据只是保存该特定帖子的所有用户的用户 ID。我只需要查看 auth.getUid() 是否存在于“saves”的子项中,如果为“是”,那么我想将此特定帖子添加到名为 mySavedPosts 的列表中。 所以你想检查UID是否存在于特定的孩子下,如果是,是哪个?还是在“帖子”下的所有孩子中? @AlexMamo 嗨,Alex,我正在详细解释你,但也请参阅附图以了解数据库结构。首先,我必须进入“帖子”根节点。然后我必须检查每个帖子都有一个由 push() 生成的唯一 postID。在每个帖子下,我只需要在“保存”下检查 UID。如果 UID 存在,那么我必须将相应的帖子(在“保存”子项中存在 UID)添加到我的列表中。我希望你清楚。 【参考方案1】:

根据您的评论:

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

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

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!
        
    
);

【讨论】:

工作就像一个魅力!非常感谢@AlexMamo。我已经为此苦苦挣扎了 2 天,而您在几分钟内就做到了!只需复制粘贴您的代码即可!肯定会看到我做错了什么。我已经接受了答案。再次感谢您。

以上是关于如何使用 Firebase 实时数据库创建特定用户所有已保存帖子的列表?的主要内容,如果未能解决你的问题,请参考以下文章

Firebase 实时数据库:如何在按值排序后围绕特定键检索 10 条记录?

如何只允许特定用户在 Firebase 中创建新用户?

如何根据特定时间删除 Firebase 数据库中的项目

如何在 Firebase 实时数据库(Android 开发)中获取特定子项的键值?

检查 Firebase 实时数据库中的现有值

如何在我的 firebase 和 flutter 应用上创建实时用户数?