【问题标题】:Firebase iterations are slowFirebase 迭代很慢
【发布时间】:2018-06-27 11:23:43
【问题描述】:

我正在使用带有 android 的 firebase 来创建一个简单的聊天应用程序。当用户选择另一个用户聊天时,我想检查他们是否一起聊天。

onCreate() 方法中,我正在检索当前用户之前使用的所有房间,并将它们放入一个名为MyChatRooms<> 的数组列表中。 然后我想检查每个房间以查看房间的用户。

问题是我用来遍历房间名称的循环在我能够从数据库中检索任何数据之前完成。

我知道我有类似的问题,但没有一个答案对我有用。

相关代码如下:

if (!MYChatRooms.isEmpty()) {
  for (j = 0; j < MYChatRooms.size(); j++) {
    roomref.child(MYChatRooms.get(j)).child("First User").addValueEventListener(new ValueEventListener() {
      @Override
      public void onDataChange(DataSnapshot dataSnapshot1) {
        if (!dataSnapshot1.getValue().toString().equals(Username) && dataSnapshot1.getValue().toString().equals(NUsername)) {
          Users += dataSnapshot1.getValue().toString() + ",,, ";
        } else if (dataSnapshot1.getValue().toString().equals(Username)) {
          roomref.child(MYChatRooms.get(j)).child("Second User").addValueEventListener(new ValueEventListener() {
            @Override
            public void onDataChange(DataSnapshot dataSnapshot2) {
              if (dataSnapshot2.getValue().toString().equals(NUsername)) {
                Users += dataSnapshot2.getValue().toString() + ",,, ";
              }
            }

            @Override
            public void onCancelled(DatabaseError databaseError) {

            }
          });
        }
      }

      @Override
      public void onCancelled(DatabaseError databaseError) {

      }
   });
  }
}

【问题讨论】:

  • 如果没有看到相应的数据结构,代码很难阅读。请编辑您的问题以包含 JSON 的 sn-p(作为文本,没有屏幕截图)。您可以通过单击Firebase Database console 中的“导出 JSON”链接来获取此信息。
  • 但我的第一个猜测是您应该考虑使用不同的数据结构。循环遍历房间以找到匹配的房间可能非常昂贵。 M.Waqas Pervez 的答案显示了另一种结构,但也考虑使用标识用户的房间名称/密钥,正如我在这里展示的那样:stackoverflow.com/questions/33540479/…

标签: android firebase firebase-realtime-database


【解决方案1】:

我建议您更改数据的结构。想象一下,如果用户有 100 次聊天,这意味着您必须向 Firebase 查询 200 次,这当然看起来不可行。

我建议您在每个用户中添加一个最近聊天列表,并且每当用户开始与某人进行新聊天时,您将第二个用户的 ID 添加到该列表中。这样您就可以轻松跟踪当前用户与谁进行了交互。

firebase 中的 It 结构可能如下所示:

  • 用户
    • 最近的聊天记录
      • 其他用户的id

【讨论】:

    【解决方案2】:

    尝试更改数据库层次结构或使用 firestore 代替实时数据库

    【讨论】:

      【解决方案3】:

      请检查以下主题:https://firebase.google.com/docs/database/usage/optimize? 就我而言,我在 Firebase 规则中添加了索引列并限制了查询。

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2017-02-03
        • 2017-09-28
        • 2019-06-25
        • 1970-01-01
        • 2012-03-13
        • 2018-05-12
        • 2019-11-24
        • 1970-01-01
        相关资源
        最近更新 更多