如何使用 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 条记录?