我正在尝试通过其应用中具有searchview的邮件来获取特定用户。

我的数据库中有7000多个用户,使用此searchview大约需要5到10或15秒才能过滤和导入数据

@Override
public boolean onQueryTextSubmit(String s) {

    searchQuery.startAt(s).endAt(s+"\uf8ff").limitToFirst(3).addListenerForSingleValueEvent(new ValueEventListener() {
        @Override
        public void onDataChange(DataSnapshot dataSnapshot) {
            for(DataSnapshot snapshot : dataSnapshot.getChildren()){
                UserPojo user = snapshot.getValue(UserPojo.class);
                Log.i(TAG, "onDataChange: " + user.getEmail());

            }
        }

        @Override
        public void onCancelled(DatabaseError databaseError) {

        }
    });

    return false;
}


问题是过滤数据所需的时间(5到15秒)

无论如何,有没有一个更好的查询来进行更快的过滤?还是我需要首先获取所有数据,将其存储在本地,然后在客户端进行过滤?关于如何解决这个问题有什么建议吗?

我还通过探查器注意到,每次搜索要占用4到8 mb的网络才能完成,这只是简单的文本查询在很多网络上的使用。

See network usage here

谢谢

最佳答案

听起来您可能尚未在要搜索的字段上定义索引。如果没有索引,则无法在服务器上进行过滤。因此,在这种情况下,服务器会将所有数据发送到客户端,由客户端进行过滤。这可以解释为什么花费的时间比您预期的更长:它必须将所有7000个用户配置文件发送到客户端。

如果确实是问题的原因,则可以通过在规则文件中添加索引来解决此问题。假设您要在名为users的属性上排序/过滤名为email的列表,可以通过以下方式进行操作:

{
  "rules": {
    "users": {
      ".indexOn": "email"
    }
  }
}


有关此主题的更多信息,请参见Firebase documentation on indexing data

07-24 09:38
查看更多