Firebase迭代速度很慢

时间:2018-06-27 11:23:43

标签: android firebase firebase-realtime-database

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

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

      }
   });
  }
}

3 个答案:

答案 0 :(得分:1)

我建议您更改数据的结构。想象一下,如果一个用户进行了100次聊天,这意味着您必须查询200次才能Firebase,但这显然是不可行的。

我的建议是,您在每个用户中添加一个“最近聊天”列表,每当一个用户与某人开始新聊天时,便将第二个用户的ID添加到该列表中。这样,您可以轻松跟踪当前用户与之交互的人。

firebase中的结构看起来像这样:

  • 用户
    • 最近聊天
      • 其他用户的ID

答案 1 :(得分:1)

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

答案 2 :(得分:0)

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