首页 > 解决方案 > 如何在 Firebase 中检索节点下的所有子节点?

问题描述

如何检索存储在 Post 节点下的所有信息。我想将该值添加到我的帖子列表中,这反过来将填充我的回收视图。我已经尝试使用用户 UID 访问我的数据库,但这只检索单个用户的信息。

My firebase structure
Post
 fyvqJOIym3RMNS7L29Oqij9HUX12 (UID)
 -LlCmqQCSmdfK9lhCjuP         (Random push key)
 desc: 
 id: 
 image: 
 name: 
 profileimage: 
 -LlCn0eTBh3dHRGek95j        (Random push key)
 desc: 
 id: 
 image: 
 name: 
 profileimage: 




/Retrieves information stored inside Post node...
    public void fetchUserInfo() {
        Toast.makeText(this, "fetch info method called", Toast.LENGTH_SHORT).show();
        postRef = FirebaseDatabase.getInstance().getReference().child("Post");
        postRef.addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot) {
                for (DataSnapshot ds : dataSnapshot.getChildren()) {
                    value = ds.getValue(Post.class);
                    postList.add(value);
                    randomPostKeyId = ds.getKey();
                }
                adapter = new Adapter(Shop_Activity.this, postList);
                recyclerView.setAdapter(adapter);
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {
                Log.i("Error", databaseError.toString());

            }
        });
    }

标签: androidfirebasefirebase-realtime-database

解决方案


所以你有了

--Post
----userUID1
------postUUID
--------postData
------postUUID
--------postData
----userUID2
------postUUID
--------postData

我可以建议您以这种方式构造数据:

-- Posts
---- postUUID 1
------ author: userUUID 1
------ desc: ...
------ image: ...
------ name: ...
---- postUUID 2
------ author: userUUID 1
------ desc: ...
------ image: ...
------ name: ...
---- postUUID 3
------ author: userUUID 2
------ desc: ...
------ image: ...
------ name: ...
////////////////////////////
-- Users
---- userUUID 1
------ profileimage: ...
------ ......
---- userUUID 2
------ profileimage: ...
------ ......

当您想按用户查询帖子时,只需以这种方式查询:ref.child("Posts").orderByChild("author").equalsTo(userUID).add...
如果您想要所有帖子,只需以这种方式查询:

ref.child("Posts").addChildEventListener(new ChildEventListener(){*/methods implementatio/*})

在 onChildAdded(){...} 中,您只会获得单个帖子数据,但这将一一检索所有帖子并继续实时收听新帖子,因此您只需获取此单个帖子并将其作为参数传递给方法在所需的视图中显示此数据。此外,如果您想显示用户信息,您只需在内部查询用户(您可以使用 (String, UserClass) 创建一个哈希图,例如 (userUID, UserData) 并检查您是否已经拥有该用户的数据以及是否拥有它只是获取它而不是一次又一次地下载它)。
但是,如果您想坚持这一点,请查看:

public void fetchUserInfo() {
    Toast.makeText(this, "fetch info method called", Toast.LENGTH_SHORT).show();
    postRef = FirebaseDatabase.getInstance().getReference().child("Post");
    postRef.addValueEventListener(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for (DataSnapshot ds : dataSnapshot.getChildren()) {
                for(DataSnapshot singlePostData : ds.getChildren() {
                    value = singlePostData.getValue(Post.class);
                    postList.add(value);
                    randomPostKeyId = singlePostData.getKey();
                }
            }
            adapter = new Adapter(Shop_Activity.this, postList);
            recyclerView.setAdapter(adapter);
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {
            Log.i("Error", databaseError.toString());

        }
    });
}

由于您在 Post 中获得了所有子项,因此您将获得具有关键 userID 的对象并以帖子作为值列出。您必须使用用户 ID 和帖子列表遍历每个对象,并在每个循环内遍历此帖子列表。代码可能不是很准确,但这就是逻辑。


推荐阅读