java - 从 FireBase (Android) 检索特定数据

标签 java android eclipse firebase

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

聊天

  • 聊天1
    • 留言1
      • 作者1
      • 消息正文
    • 留言2
      • 作者2
      • 消息正文
    • 留言3
      • 作者1
      • 消息正文
  • 聊天2
    • 留言1
      • 作者3
      • 消息正文
    • 留言2
      • 作者4
      • 消息正文
    • 留言3
      • 作者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/

相关文章:

java - Eclipse 代码辅助

java - "can not get class data for sun/java2d/Disposer"

java - 我无法使用 GSON 将 JSON 转换为 class<T>

android - 如何在 RecyclerView 中设置相等的行高?

java - 如何在 Eclipse 中按方法的完全限定名称进行搜索

linux - 无法启动 Nvidia nsight

java - 在 JavaFX setOnAction() 方法中写入 OutputStream

java - 适用于 Android 的 Adob​​e AIR 打包

java - 如果@ApplicationScope,CDI( Weld 3.0.3.Final)不会调用@PostConstruct

java - 无法在 WebView 中加载网站 - 为什么?