如何使用 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!
}
}
});
我有一个名为 '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!
}
}
});