android - 添加或删除文档时如何仅从数据库中读取数据
问题描述
我的代码有问题。我只想在添加或删除文档时收听。代码运行良好。现在,当添加文档时 - 吐司出现。这很好用。但是当我查看数据库中的读取计数器时——它增长得如此之快,就像函数是 100% 的时间从数据库中读取所有数据一样——不仅仅是为了改变,就像我想要的那样。我只需要听集合中的变化。这是在android中做到这一点的一种方法吗?我有一个 webapp,我的 javascript 代码运行良好,只有在更改出现时才读取数据。
在我的代码下面:
public void listenToDocument() {
// [START listen_document]
myDatabase.collection("markery").addSnapshotListener(new EventListener<QuerySnapshot>()
{
@Override
public void onEvent(@Nullable QuerySnapshot snapshots,
@Nullable FirebaseFirestoreException e) {
if (e != null) {
Log.w(TAG, "listen:error", e);
return;
}
for (DocumentChange documentChange : snapshots.getDocumentChanges()) {
switch (documentChange.getType()) {
case ADDED:
String popup_data = documentChange.getDocument().getData().get("popup_data").toString();
GeoPoint geop = (GeoPoint) documentChange.getDocument().getData().get("geop");
Context context = getApplicationContext();
Toast toast = Toast.makeText(context, popup_data, Toast.LENGTH_LONG);
toast.show();
double lng = geop.getLongitude();
double lat = geop.getLatitude();
symbolLayerIconFeatureList.add(Feature.fromGeometry(
Point.fromLngLat(lng, lat)));
break;
case MODIFIED:
break;
case REMOVED:
break;
}
}
}
});
// [END listen_document]
}
解决方案
当您将侦听器添加到查询(或集合引用,它只是对集合中所有文档的查询)时,它将读取所有文档并将它们全部传递给您的侦听器以进行第一次调用。在某个时间点之后,无法仅为新的和更改的文档添加侦听器。
如果您只想要新的更改,您应该添加某种时间戳字段,以获取每次更改的更新,并使用该时间戳过滤您的查询,以便仅将新修改的文档传递给侦听器。例如:
myDatabase
.collection("markery")
.whereGreaterThan("timestamp", new Date())
.addSnapshotListener(...)
确保时间戳更新到当前时间以及对该集合中每个文档的每次更新都取决于您。
推荐阅读
- java - Randoop 执行错误,由于异常无法加载类
- django - 如何在 Django REST 框架中正确设置 HTTP_405_METHOD_NOT_ALLOWED 状态代码的 Allow 标头
- swift - NSFetchedResultsController 在删除后不更新计数
- python - 将 Python 文件转换为可执行文件
- java - 如何从文件中读取特定对象的数组列表
- smalltalk - 在 GNU Smalltalk 中使用和不使用“new”创建的实例之间的区别
- c# - 如何修复错误“'3/23/2019 12:00:00 AM'的值对'Value'无效。'Value'应介于'MinDate'和'MaxDate'之间。”
- emacs - 如何将 SPC-bb 或 SPC-pb 映射到像 ä,ö,ü 这样的变音符号
- java - 扫描仪总是需要两个输入(Java)
- python - 如何使用我分配的键绑定移动我的精灵?