从FireBase(Android)检索特定数据

eng*_*ico 4 java eclipse android firebase

我正在制作聊天应用,我有一个具有以下结构的Firebase.Chat1,Chat2,Chat3 ...用于保存不同聊天组的数据.Message1,Message2,Message3是第1组内的消息.它可以来自任何作者.

聊天

  • 客服1
    • MESSAGE1
      • 作者1
      • MessageText中
    • 消息2
      • Author2
      • MessageText中
    • 消息3
      • 作者1
      • MessageText中
  • 客服2
    • MESSAGE1
      • Author3
      • MessageText中
    • 消息2
      • Author4
      • MessageText中
    • 消息3
      • 作者1
      • MessageText中
  • Chat3

我想从"作者1"中检索所有消息的列表.含义Message1,Message3应该从Chat1中检索,而Message3也应该从Chat2中检索.我想显示来自1位作者的所有消息.

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() {

    }
});
Run Code Online (Sandbox Code Playgroud)

这给了我全部数据!如何将其限制为"Author1"?

Fra*_*len 11

Firebase将始终检索您要求的完整节点.既然你要求一次聊天或整个聊天(你不清楚你的代码是哪一个),那就是你得到的.

如果您希望从Firebase获取更少的数据,您必须更加具体地了解您的要求.例如,如果你想显示客服1,然后通过监听开始孩子们的客服1的节点.

此代码段来自AndroidFirebase指南:

// 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.
});
Run Code Online (Sandbox Code Playgroud)

此代码段与您当前的示例完成相同的操作,但forFirebase 不是通过数据循环使用数据,而是一次向您提供一条消息.

有了这些,您可以过滤消息.这是一个两步过程:首先按子节点排序,然后限制返回哪些节点.

Query query = ref.orderByChild("Author").equalTo("Author1", "Author");
query.addChildEventListener(new ChildEventListener() {
    // the rest of the code remains the same as above
Run Code Online (Sandbox Code Playgroud)

最后一点最好在有关查询Firebase文档中进行说明.