android - 如何在 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());
}
});
}
解决方案
所以你有了
--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 和帖子列表遍历每个对象,并在每个循环内遍历此帖子列表。代码可能不是很准确,但这就是逻辑。
推荐阅读
- python - 您如何使用/制作 kivy 语言的自定义小部件,但使用 python 代码?
- elasticsearch - 日期范围内的搜索间隔示例
- ios - UIView.animate 忽略我创建的自定义弹出窗口的持续时间。斯威夫特 5
- reactjs - 为什么使用 Recorder.js 和 MediaDevices 录制多个音频会导致稍后出现空录制?
- javascript - 无法将属性应用于 checkBoxFor
- client-server - 将消息从 grpc 服务器广播到 python 中的所有/一些连接的客户端
- discord.py - 将不和谐用户的头像和昵称复制到机器人
- android - Flutter 播放器不会播放来自 podbean 的音频
- php - 方法 Illuminate\Support\Collection::orWhere 不存在
- c# - 两个对象在 Unity 中不断获得相同的随机数