我正在制作一个聊天应用程序,并且我有一个具有以下结构的 Firebase。 Chat1,Chat2,Chat3...用于保存不同聊天组的数据。 Message1、Message2、Message3 是第一组中的消息。它可以来自任何作者。
聊天
- 聊天1
- 留言1
- 作者1
- 消息正文
- 留言2
- 作者2
- 消息正文
- 留言3
- 作者1
- 消息正文
- 留言1
- 聊天2
- 留言1
- 作者3
- 消息正文
- 留言2
- 作者4
- 消息正文
- 留言3
- 作者1
- 消息正文
- 留言1
- 聊天3
我想检索来自“作者 1”的所有消息的列表。意思是 Message1、Message3 应该从 Chat1 中检索,Message3 也应该从 Chat2 中检索。我想显示来自一位作者的所有消息。
ref = new Firebase(FIREBASE_URL); //Root URL
ref.addValueEventListener(new ValueEventListener() {
@Override
public void onDataChange(DataSnapshot dataSnapshot) {
for (DataSnapshot child : dataSnapshot.getChildren()) {
for (DataSnapshot childd : child.getChildren()) {
//This might work but it retrieves all the data
}
}
}
@Override
public void onCancelled() {
}
});
这给了我完整的数据!如何将其限制为“Author1”?
最佳答案
Firebase 将始终检索您请求的完整节点。由于您一次请求所有聊天或整个聊天(不清楚您从代码中执行了哪一个),这就是您得到的结果。
如果您想从 Firebase 获取较少的数据,则必须更具体地说明您从中获取的数据。例如,如果您想要显示 Chat1,则首先监听 Chat1 节点的子。
此 fragment 来自Firebase guide for Android :
// Retrieve new posts as they are added to Firebase
ref.addChildEventListener(new ChildEventListener() {
// Retrieve new posts as they are added to Firebase
@Override
public void onChildAdded(DataSnapshot snapshot, String previousChildKey) {
Map<String, Object> newPost = (Map<String, Object>) snapshot.getValue();
System.out.println("Author: " + newPost.get("author"));
System.out.println("Title: " + newPost.get("title"));
}
//... ChildEventListener also defines onChildChanged, onChildRemoved,
// onChildMoved and onCanceled, covered in later sections.
});
此代码段完成与您当前示例相同的操作,但 Firebase 不是您的代码使用 for
遍历数据,而是一次为您提供一条消息。
有了它,您就可以过滤消息了。这是一个两步过程:首先按子节点排序,然后限制返回哪些节点。
Query query = ref.orderByChild("Author").equalTo("Author1", "Author");
query.addChildEventListener(new ChildEventListener() {
// the rest of the code remains the same as above
最后一点在 Firebase documentation on queries 中得到了最好的解释。 .
关于java - 从 FireBase (Android) 检索特定数据,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27187725/