添加或删除文档时如何仅从数据库读取数据

时间:2020-07-12 14:31:47

标签: android firebase google-cloud-firestore

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

1 个答案:

答案 0 :(得分:0)

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

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

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

由您决定将时间戳更新为当前时间,以及该集合中每个文档的每次更新。