我正在尝试通过其应用中具有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。