Эта страница была переведа с помощью Cloud Translation API.
Switch to English

Доступ к данным в автономном режиме

Cloud Firestore поддерживает сохранение данных в автономном режиме. Эта функция кэширует копию данных Cloud Firestore, которые ваше приложение активно использует, поэтому ваше приложение может получить доступ к данным, когда устройство отключено. Вы можете писать, читать, слушать и запрашивать кэшированные данные. Когда устройство возвращается в сеть, Cloud Firestore синхронизирует любые локальные изменения, внесенные вашим приложением, с серверной частью Cloud Firestore.

Чтобы использовать автономное сохранение, вам не нужно вносить какие-либо изменения в код, который вы используете для доступа к данным Cloud Firestore. При включенном автономном сохранении клиентская библиотека Cloud Firestore автоматически управляет доступом к данным в режиме онлайн и в автономном режиме и синхронизирует локальные данные, когда устройство снова в сети.

Настроить сохранение в автономном режиме

При инициализации Cloud Firestore вы можете включить или отключить сохранение в автономном режиме:

  • Для Android и iOS постоянное сохранение в автономном режиме включено по умолчанию. Чтобы отключить постоянство, установите для параметра PersistenceEnabled значение false .
  • Для Интернета сохранение автономного режима отключено по умолчанию. Чтобы включить постоянство, вызовите метод enablePersistence . Кеш Cloud Firestore не очищается автоматически между сеансами. Следовательно, если ваше веб-приложение обрабатывает конфиденциальную информацию, не забудьте спросить пользователя, находится ли он на доверенном устройстве, прежде чем включать сохранение.
Интернет
firebase.firestore().enablePersistence()
  .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
          // ...
      }
  });
// Subsequent queries will use persistence, if it was enabled successfully
  
Swift
let settings = FirestoreSettings()
settings.isPersistenceEnabled = true

// Any additional options
// ...

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

// Any additional options
// ...

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

Ява

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setPersistenceEnabled(true)
        .build();
db.setFirestoreSettings(settings);

Котлин + KTX

val settings = firestoreSettings {
    isPersistenceEnabled = true
}
db.firestoreSettings = settings

Настроить размер кеша

Когда постоянство включено, Cloud Firestore кэширует каждый документ, полученный от серверной части, для автономного доступа. Cloud Firestore устанавливает порог по умолчанию для размера кеша. После превышения значения по умолчанию Cloud Firestore периодически пытается очистить старые неиспользуемые документы. Вы можете настроить другой порог размера кеша или полностью отключить процесс очистки:

Интернет
// The default cache size threshold is 40 MB. Configure "cacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "CACHE_SIZE_UNLIMITED"
// to disable clean-up.
firebase.firestore().settings({
  cacheSizeBytes: firebase.firestore.CACHE_SIZE_UNLIMITED
});

firebase.firestore().enablePersistence()
  
Swift
// The default cache size threshold is 100 MB. Configure "cacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "FirestoreCacheSizeUnlimited"
// to disable clean-up.
let settings = Firestore.firestore().settings
settings.cacheSizeBytes = FirestoreCacheSizeUnlimited
Firestore.firestore().settings = settings
Цель-C
// The default cache size threshold is 100 MB. Configure "cacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "kFIRFirestoreCacheSizeUnlimited"
// to disable clean-up.
FIRFirestoreSettings *settings = [FIRFirestore firestore].settings;
settings.cacheSizeBytes = kFIRFirestoreCacheSizeUnlimited;
[FIRFirestore firestore].settings = settings;
  

Ява


// The default cache size threshold is 100 MB. Configure "setCacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "CACHE_SIZE_UNLIMITED"
// to disable clean-up.
FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
        .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
        .build();
db.setFirestoreSettings(settings);

Котлин + KTX


// The default cache size threshold is 100 MB. Configure "setCacheSizeBytes"
// for a different threshold (minimum 1 MB) or set to "CACHE_SIZE_UNLIMITED"
// to disable clean-up.
val settings = FirebaseFirestoreSettings.Builder()
        .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
        .build()
db.firestoreSettings = settings

Слушайте офлайн-данные

Пока устройство находится в автономном режиме, если вы включили сохранение в автономном режиме, ваши слушатели будут получать события прослушивания при изменении локально кэшированных данных. Вы можете слушать документы, коллекции и запросы.

Чтобы проверить, получаете ли вы данные с сервера или кеша, используйте свойство fromCache в SnapshotMetadata в событии моментального снимка. Если fromCache true , данные были fromCache из кеша и могут быть устаревшими или неполными. Если fromCache имеет значение false , данные являются полными и актуальными с учетом последних обновлений на сервере.

По умолчанию событие не возникает, если изменен только SnapshotMetadata . Если вы полагаетесь на значения fromCache , укажите includeMetadataChanges прослушивания includeMetadataChanges при присоединении обработчика прослушивания.

Интернет
db.collection("cities").where("state", "==", "CA")
  .onSnapshot({ includeMetadataChanges: 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);
      });
  });
 
Swift
// Listen to metadata updates to receive a server snapshot even if
// the data is the same as the cached data.
db.collection("cities").whereField("state", isEqualTo: "CA")
    .addSnapshotListener(includeMetadataChanges: true) { 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)")
}
Цель-C
// Listen to metadata updates to receive a server snapshot even if
// the data is the same as the cached data.
[[[db collectionWithPath:@"cities"] queryWhereField:@"state" isEqualTo:@"CA"]
    addSnapshotListenerWithIncludeMetadataChanges:YES
    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);
    }];
  

Ява

db.collection("cities").whereEqualTo("state", "CA")
        .addSnapshotListener(MetadataChanges.INCLUDE, 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);
                }

            }
        });

Котлин + KTX

db.collection("cities").whereEqualTo("state", "CA")
        .addSnapshotListener(MetadataChanges.INCLUDE) { querySnapshot, e ->
            if (e != null) {
                Log.w(TAG, "Listen error", e)
                return@addSnapshotListener
            }

            for (change in querySnapshot!!.documentChanges) {
                if (change.type == DocumentChange.Type.ADDED) {
                    Log.d(TAG, "New city: ${change.document.data}")
                }

                val source = if (querySnapshot.metadata.isFromCache)
                    "local cache"
                else
                    "server"
                Log.d(TAG, "Data fetched from $source")
            }
        }

Получить офлайн-данные

Если вы получаете документ, когда устройство отключено, Cloud Firestore возвращает данные из кеша.

При запросе коллекции возвращается пустой результат, если кэшированные документы отсутствуют. Вместо этого при получении определенного документа возвращается ошибка.

Запрос офлайн-данных

Запросы работают с сохранением в автономном режиме. Вы можете получать результаты запросов с помощью прямого получения или прослушивания, как описано в предыдущих разделах. Вы также можете создавать новые запросы к локально сохраненным данным, когда устройство находится в автономном режиме, но изначально запросы будут выполняться только для кэшированных документов.

Отключить и включить доступ к сети

Вы можете использовать метод ниже, чтобы отключить доступ к сети для вашего клиента Cloud Firestore. Пока сетевой доступ отключен, все прослушиватели моментальных снимков и запросы документов получают результаты из кеша. Операции записи ставятся в очередь до повторного включения доступа к сети.

Интернет
firebase.firestore().disableNetwork()
    .then(function() {
        // Do offline actions
        // ...
    });
  
Swift
Firestore.firestore().disableNetwork { (error) in
    // Do offline things
    // ...
}
Цель-C
[[FIRFirestore firestore] disableNetworkWithCompletion:^(NSError *_Nullable error) {
  // Do offline actions
  // ...
}];
  

Ява

db.disableNetwork()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // Do offline things
                // ...
            }
        });

Котлин + KTX

db.disableNetwork().addOnCompleteListener {
    // Do offline things
    // ...
}

Используйте следующий метод для повторного включения доступа к сети:

Интернет
firebase.firestore().enableNetwork()
    .then(function() {
        // Do online actions
        // ...
    });
  
Swift
Firestore.firestore().enableNetwork { (error) in
    // Do online things
    // ...
}
Цель-C
[[FIRFirestore firestore] enableNetworkWithCompletion:^(NSError *_Nullable error) {
  // Do online actions
  // ...
}];
  

Ява

db.enableNetwork()
        .addOnCompleteListener(new OnCompleteListener<Void>() {
            @Override
            public void onComplete(@NonNull Task<Void> task) {
                // Do online things
                // ...
            }
        });

Котлин + KTX

db.enableNetwork().addOnCompleteListener {
    // Do online things
    // ...
}