【问题标题】:How to only read data from database when the document is added or deleted [duplicate]添加或删除文档时如何仅从数据库中读取数据[重复]
【发布时间】:2020-07-12 14:31:47
【问题描述】:

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

【问题讨论】:

  • 您是否在 Firebase 控制台中打开了文档列表?如果是这样,请记住,Firebase 控制台执行的任何读取也计入您的项目使用量,并且(在早期开发期间)通常比您的实际代码更有可能增加读取计数。

标签: android firebase google-cloud-firestore


【解决方案1】:

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

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

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

您需要确保时间戳更新为当前时间以及对该集合中每个文档的每次更新。

【讨论】:

  • 我会尝试使用时间戳。但我有疑问,为什么即使收藏没有变化,我的计数器仍在增加。我知道当进行更改时,我将获得所有文件,而不仅仅是添加。但是该函数一直在读取文档,而不仅仅是在进行更改时。
  • 使用 Firestore 控制台的成本读取。 stackoverflow.com/questions/56434008/firestore-unexpected-reads
  • 我不算 Firestore 控制台。我知道那是有代价的。我只有 2 个文档,apk 工作了 5-10 分钟,我现在有 600 次读取计数。
  • 我们无法看到与您的数据库的所有交互。您将不得不通过消除除执行侦听的特定代码位之外的所有内容并控制特定更新来缩小范围。
猜你喜欢
  • 1970-01-01
  • 2012-02-23
  • 2019-07-28
  • 1970-01-01
  • 1970-01-01
  • 2021-07-23
  • 1970-01-01
  • 2018-12-07
  • 1970-01-01
相关资源
最近更新 更多