首页 > 解决方案 > 添加或删除文档时如何仅从数据库中读取数据

问题描述

我的代码有问题。我只想在添加或删除文档时收听。代码运行良好。现在,当添加文档时 - 吐司出现。这很好用。但是当我查看数据库中的读取计数器时——它增长得如此之快,就像函数是 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]
}

标签: androidfirebasegoogle-cloud-firestore

解决方案


当您将侦听器添加到查询(或集合引用,它只是对集合中所有文档的查询)时,它将读取所有文档并将它们全部传递给您的侦听器以进行第一次调用。在某个时间点之后,无法仅为新的和更改的文档添加侦听器。

如果您只想要新的更改,您应该添加某种时间戳字段,以获取每次更改的更新,并使用该时间戳过滤您的查询,以便仅将新修改的文​​档传递给侦听器。例如:

myDatabase
    .collection("markery")
    .whereGreaterThan("timestamp", new Date())
    .addSnapshotListener(...)

确保时间戳更新到当前时间以及对该集合中每个文档的每次更新都取决于您。


推荐阅读