Firestore - 使用缓存直到在线内容更新

Posted

技术标签:

【中文标题】Firestore - 使用缓存直到在线内容更新【英文标题】:Firestore - Using cache until online content updates 【发布时间】:2017-10-21 22:06:26 【问题描述】:

我从 Firestore 开始。我已经阅读了有关离线数据持久性的文档和教程,但我并不清楚 Firestore 是否会再次下载数据,即使内容没有被修改。 例如,如果我有一个查询结果将每周更新一次,并且在进行更改之前我不需要应用程序再次下载内容,那么在效率方面编写代码的最佳方法是什么? 谢谢!

【问题讨论】:

【参考方案1】:

您想使用“快照侦听器”API 来侦听您的查询: https://firebase.google.com/docs/firestore/query-data/listen#listen_to_multiple_documents_in_a_collection

以下是一些 javascript 示例:

db.collection("cities").where("state", "==", "CA")
    .onSnapshot(function(querySnapshot) 
        var cities = [];
        querySnapshot.forEach(function(doc) 
            cities.push(doc.data().name);
        );
        console.log("Current cities in CA: ", cities.join(", "));
    );

您第一次附加此侦听器时,Firestore 将访问网络以将所有结果下载到您的查询中,并为您提供查询快照,正如您所期望的那样。

如果您第二次附加相同的侦听器并且您正在使用离线持久性,则侦听器将立即触发缓存中的结果。以下是检测结果是来自缓存还是本地的方法:

db.collection("cities").where("state", "==", "CA")
  .onSnapshot( includeQueryMetadataChanges: true , function(snapshot) 
      snapshot.docChanges.forEach(function(change) 
          if (change.type === "added") 
              console.log("New city: ", change.doc.data());
          

          var source = snapshot.metadata.fromCache ? "local cache" : "server";
          console.log("Data came from " + source);
      );
  );

在您获得缓存结果后,Firestore 将与服务器检查您的查询结果是否有任何更改。如果是,您将获得另一个包含更改的快照。

如果您希望收到仅涉及元数据的更改的通知(例如,如果没有文档更改但snapshot.metadata.fromCache 更改),您可以在发出查询时使用QueryListenOptions: https://firebase.google.com/docs/reference/android/com/google/firebase/firestore/QueryListenOptions

【讨论】:

先生,能否请您提供此信息? ***.com/questions/50782574/… 。谢谢:) 我认为这不准确。根据文档,默认情况下,Firestore 将首先尝试服务器数据,只有在失败时才会回退到缓存。 firebase.google.com/docs/reference/android/com/google/firebase/… 这确实因平台而异。 JS Web 使用如上所述的缓存。但是,移动平台有不同的行为。

以上是关于Firestore - 使用缓存直到在线内容更新的主要内容,如果未能解决你的问题,请参考以下文章

如何使用本地缓存并仅使用 Firestore 更新更改的文档?

Firestore:仅当有更新时才从服务器获取数据,否则从缓存中获取

在 Android 上使用 Firestore 的缓存策略

我们会为仅从缓存中读取(Cloud FireStore)支付(成本)吗? [复制]

在 Cloud Firestore 中管理在线状态

Google Firestore 是缓存文档和集合还是总是请求新的?