我从Firestore开始。我读过关于离线数据持久性的文档和教程,但我并不清楚Firestore是否会再次下载数据,即使内容没有修改。例如,如果我有一个查询,结果将每周更新一次,并且在做出更改之前我不需要应用程序再次下载内容,那么就编写代码的效率而言,最好的方法是什么?谢谢
您想要使用"快照侦听器"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