java - 根据 ID 读取实际的 Firebase 记录

标签 java android firebase firebase-realtime-database flatten

假设我有一个 Firebase Realtime 数据库结构,其中有用户节点,每个用户节点都有仅包含帖子 ID 的帖子节点。然后还有实际帖子所在的单独帖子节点(平面数据结构)。结构详细描述见 this answer

现在,如果我可以通过将监听器附加到每个用户的帖子节点来获取该用户帖子的 ID,那么如何检索帖子本身(来自帖子节点的完整信息)?我知道没有任何查询可以传递一堆 key 并获取关联的记录。我应该将监听器附加到我感兴趣的每个帖子节点吗?我目前担心可能会出现一些严重的性能问题,因为帖子数量实际上是无限的。

最佳答案

使用与此 post 完全相同的数据库结构,要解决您的问题,您需要查询数据库两次。一次获取您需要的特定用户的帖子 ID,第二次获取帖子本身。为此,请使用以下代码:

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

关于java - 根据 ID 读取实际的 Firebase 记录,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/49586833/

相关文章:

Firebase:删除所有经过身份验证的用户

javascript - 访问已删除然后重新创建的帐户的个人资料照片时,Firebase 返回 "no-referrer-when-downgrade"

java - 在 Java 中通过套接字发送无符号字节

java - Android 上的 JainSip : Sending REGISTER throws Exception

java - 从字符串中提取子字符串(包含动态部分)?

android - 创建音频频谱可视化 android 应用程序

android - 当文本太长时,如何减小 TextView 的大小?

java.lang.NoSuchMethodError : org. apache.poi.util.IOUtils.copy(Ljava/io/InputStream;Ljava/io/OutputStream;)

安卓 : Streaming Audio TO a URL in Android using AudioRecord

javascript - TypeError : this. mRef.auth 不是函数