根据 ID 读取实际的 Firebase 记录
Reading actual Firebase records based on their ids
假设我有一个 Firebase 实时数据库结构,其中有用户节点,每个用户节点有 post 个仅包含 post 个 ID 的节点。然后还有单独的 post 节点,实际 post 所在的节点(平面数据结构)。结构在 .
中有详细描述
现在,如果我可以通过将侦听器附加到每个用户的 posts 节点来获取每个用户的 posts 的 ID,我该如何检索 posts 本身(来自 post 节点的完整信息)?我知道没有任何查询可以传递一堆密钥并获取相关记录。我应该只为我感兴趣的每个 post 节点附加一个监听器吗?我目前担心可能会出现一些严重的性能问题,因为 post 的数量实际上是无限的。
使用此 中的确切数据库结构,要解决您的问题,您需要查询数据库两次。一次获得您需要的特定用户的 post id,第二次获得它自己的 posts。为此,请使用以下代码:
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference postsRef = rootRef.child("users").child(uid).child("posts");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String postId = ds.getKey();
DatabaseReference postIdRef = rootRef.child("posts").child(postId);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
String postName = dSnapshot.child("postName").getValue(String.class);
Log.d("TAG", postName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
postIdRef.addListenerForSingleValueEvent(eventListener);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
postsRef.addListenerForSingleValueEvent(valueEventListener);
假设我有一个 Firebase 实时数据库结构,其中有用户节点,每个用户节点有 post 个仅包含 post 个 ID 的节点。然后还有单独的 post 节点,实际 post 所在的节点(平面数据结构)。结构在
现在,如果我可以通过将侦听器附加到每个用户的 posts 节点来获取每个用户的 posts 的 ID,我该如何检索 posts 本身(来自 post 节点的完整信息)?我知道没有任何查询可以传递一堆密钥并获取相关记录。我应该只为我感兴趣的每个 post 节点附加一个监听器吗?我目前担心可能会出现一些严重的性能问题,因为 post 的数量实际上是无限的。
使用此
String uid = FirebaseAuth.getInstance().getCurrentUser().getUid();
DatabaseReference rootRef = FirebaseDatabase.getInstance().getReference();
DatabaseReference postsRef = rootRef.child("users").child(uid).child("posts");
ValueEventListener valueEventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot ds : dataSnapshot.getChildren()) {
String postId = ds.getKey();
DatabaseReference postIdRef = rootRef.child("posts").child(postId);
ValueEventListener eventListener = new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for(DataSnapshot dSnapshot : dataSnapshot.getChildren()) {
String postName = dSnapshot.child("postName").getValue(String.class);
Log.d("TAG", postName);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
postIdRef.addListenerForSingleValueEvent(eventListener);
}
}
@Override
public void onCancelled(DatabaseError databaseError) {}
};
postsRef.addListenerForSingleValueEvent(valueEventListener);