web-dev-qa-db-ja.com

Firestore-オンラインコンテンツが更新されるまでキャッシュを使用する

私はFirestoreから始めています。オフラインデータの永続性に関するドキュメントとチュートリアルを読みましたが、コンテンツが変更されていなくてもFirestoreがデータを再度ダウンロードするかどうかは明確ではありません。たとえば、結果が週に1回更新されるクエリがあり、変更が行われるまでアプリがコンテンツを再度ダウンロードする必要がない場合、コードを記述する効率の面で最善の方法は何ですか?ありがとう!

14
Diego Garcia

「スナップショットリスナー」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

8
Sam Stern