根据 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);