android - Android Firebase:比较设备上的值还是使用`equalTo`方法?
问题描述
我有一个用户 ID 列表,我需要获取相应的用户信息。我看到两种方法。
第一的:
user_reference.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
for (DataSnapshot dataSnapshot : snapshot.getChildren()) {
Users users = dataSnapshot.getValue(Users.class);
if (idList.contains(users.getUser_id())) {
usersList.add(users);
}
}
}
});
第二:
for (int i = 0; i < idList.size(); i++) {
user_reference.orderByChild("user_id").equalTo(idList.get(i))
.addListenerForSingleValueEvent(new ValueEventListener() {
@Override
public void onDataChange(@NonNull DataSnapshot snapshot) {
if (snapshot.exists()) {
Users users = dataSnapshot.getValue(Users.class);
usersList.add(users);
}
}
});
}
第一个似乎效率低下,因为如果我有几千个用户,它会加载每个用户,如果我只需要 5 个用户也是如此。
但是,第二种方法似乎相似,只是比较发生在服务器端。
那么哪个选项更快?
或者这两种选择都不是好方法?那么有没有我没有想到的更好的解决方案?
解决方案
第二种选择几乎总是更快,因为带宽通常是影响性能的最大因素。
要从使用服务器端查询中获得性能提升,请务必将索引添加到数据库的安全规则中。如果您忘记这样做,过滤将在 SDK 的客户端完成,它会在您的 logcat 输出中写入警告,告诉您添加索引。
推荐阅读
- excel - 如何与python共享excel工作簿?
- jsp - Sitemesh3 装饰器仅适用于 JSP 扩展
- amazon-web-services - 如何在 s3 中进行自定义设置以向某些用户显示文件夹
- c++ - 如何在c中运行命令行
- c# - 用 LINQ to XML 替换 XML 元素
- excel - Hide/Unhide merged cells in excel
- azure-devops - 测试计划下缺少“进度报告”选项
- laravel - Passing parameters to Laravel job is not working
- django - How to dump an object that is a child of a class (knowing that class casting is impossible in Python)?
- r-exams - Multiple plots in repeated question yields "Error in exm[[dups[j]]] : subscript out of bounds"