オフライン データを有効にする

Cloud Firestore は、オフライン データの永続性をサポートします。この機能により、アプリが使用している Cloud Firestore データのコピーがキャッシュに保存されるため、端末がオフラインの場合でも、アプリはデータにアクセスできます。キャッシュされたデータに対しては書き込み、読み取り、リッスン、クエリを行うことができます。端末がオンラインに戻ると、アプリがローカルで行った変更とリモートの Cloud Firestore に保存されたデータが同期されます。

オフラインの永続性を利用する場合、Cloud Firestore データへのアクセスに使用するコードに変更を行う必要はありません。オフラインの永続性を有効にすると、Cloud Firestore クライアント ライブラリは、オンラインとオフラインのデータアクセスを自動的に管理し、端末がオンラインに戻ったときにローカルデータを同期します。

オフラインの永続性を設定する

Cloud Firestore を初期化するときに、オフラインの永続性を有効にするか無効にするかを選択できます。

  • Android と iOS の場合、オフラインの永続性はデフォルトで有効になっています。永続性を無効にするには、PersistenceEnabled オプションを false に設定します。
  • ウェブの場合、オフラインの永続性はデフォルトで無効になっています。永続性を有効にするには、enablePersistence メソッドを呼び出します。Cloud Firestore のキャッシュは、セッション間で自動的にクリアされません。したがって、ウェブアプリで機密情報を処理する場合は、永続性を有効にする前に、ユーザーが信頼できる端末を使用しているかどうかをユーザーに尋ねて確認してください。
ウェブ
firebase.initializeApp({
  apiKey: '### FIREBASE API KEY ###',
  authDomain: '### FIREBASE AUTH DOMAIN ###',
  projectId: '### CLOUD FIRESTORE PROJECT ID ###',
}
);

firebase.firestore().enablePersistence()
  .then(function() {
      // Initialize Cloud Firestore through firebase
      var db = firebase.firestore();
  })
  .catch(function(err) {
      if (err.code == 'failed-precondition') {
          // Multiple tabs open, persistence can only be enabled
          // in one tab at a a time.
          // ...
      } else if (err.code == 'unimplemented') {
          // The current browser does not support all of the
          // features required to enable persistence
          // ...
      }
  });
  
Android
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(true)
        .build();
db.setFirestoreSettings(settings);
  
Swift
let settings = FirestoreSettings()
settings.isPersistenceEnabled = true

// Any additional options
// ...

// Enable offline data persistence
let db = Firestore.firestore()
db.settings = settings
Objective-C
FIRFirestoreSettings *settings = [[FIRFirestoreSettings alloc] init];
settings.persistenceEnabled = YES;

// Any additional options
// ...

// Enable offline data persistence
FIRFirestore *db = [FIRFirestore firestore];
db.settings = settings;
  

オフライン データをリッスンする

オフラインの永続性を有効にした場合、端末がオフラインの間にローカルのキャッシュ データが変更されると、リスナーがリッスン イベントを受信します。リッスンできる対象にはドキュメント、コレクション、クエリがあります。

データの取得元がサーバーかキャッシュかを確認するには、スナップショット イベントの SnapshotMetadata にある fromCache プロパティを使用します。fromCachetrue の場合、データはキャッシュから取得されています。この場合、古いデータまたは不完全なデータを使用している可能性があります。fromCachefalse の場合、データは完全で、サーバーの最新の更新内容が反映された状態です。

デフォルトでは、SnapshotMetadata だけが変更された場合はイベントが発生しません。fromCache 値を使用する場合には、リッスン ハンドラを接続するときに includeMetadataChanges リッスン オプションを指定します。

ウェブ
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);
      });
  });
 
Android
db.collection("cities").whereEqualTo("state", "CA")
        .addSnapshotListener(new EventListener<QuerySnapshot>() {
            @Override
            public void onEvent(@Nullable QuerySnapshot querySnapshot,
                                @Nullable FirebaseFirestoreException e) {
                if (e != null) {
                    Log.w(TAG, "Listen error", e);
                    return;
                }

                for (DocumentChange change : querySnapshot.getDocumentChanges()) {
                    if (change.getType() == Type.ADDED) {
                        Log.d(TAG, "New city:" + change.getDocument().getData());
                    }

                    String source = querySnapshot.getMetadata().isFromCache() ?
                            "local cache" : "server";
                    Log.d(TAG, "Data fetched from " + source);
                }

            }
        });
Swift
// Listen to metadata updates to receive a server snapshot even if
// the data is the same as the cached data.
let options = QueryListenOptions()
options.includeQueryMetadataChanges(true)

db.collection("cities").whereField("state", isEqualTo: "CA")
    .addSnapshotListener(options: options) { querySnapshot, error in
        guard let snapshot = querySnapshot else {
            print("Error retreiving snapshot: \(error!)")
            return
        }

        for diff in snapshot.documentChanges {
            if diff.type == .added {
                print("New city: \(diff.document.data())")
            }
        }

        let source = snapshot.metadata.isFromCache ? "local cache" : "server"
        print("Metadata: Data fetched from \(source)")
}
Objective-C
// Listen to metadata updates to receive a server snapshot even if
// the data is the same as the cached data.
FIRQueryListenOptions *options = [FIRQueryListenOptions options];
[options includeQueryMetadataChanges:YES];
[[[db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"]
    addSnapshotListenerWithOptions:options
    listener:^(FIRQuerySnapshot *snapshot, NSError *error) {
      if (snapshot == nil) {
        NSLog(@"Error retreiving snapshot: %@", error);
        return;
      }
      for (FIRDocumentChange *diff in snapshot.documentChanges) {
        if (diff.type == FIRDocumentChangeTypeAdded) {
          NSLog(@"New city: %@", diff.document.data);
        }
      }

      NSString *source = snapshot.metadata.isFromCache ? @"local cache" : @"server";
      NSLog(@"Metadata: Data fetched from %@", source);
    }];
  

オフライン データを取得する

端末がオフラインのときにドキュメントを取得すると、Cloud Firestore はキャッシュからデータを返します。そのドキュメントのデータがキャッシュに存在しない場合やドキュメントが存在しない場合、get 呼び出しはエラーを返します。

オフライン データにクエリを実行する

オフラインの永続性でもクエリを実行できます。ここまでに説明したように、クエリの結果を取得するには直接取得またはリッスンいずれかの方法を使用します。端末がオフラインの間にローカルに保存されたデータに対して新しいクエリを作成することもできますが、最初はキャッシュ内のドキュメントに対してのみクエリが実行されます。

フィードバックを送信...

ご不明な点がありましたら、Google のサポートページをご覧ください。