Cómo habilitar datos sin conexión

Cloud Firestore permite conservar datos sin conexión. Esta función almacena en caché una copia de los datos de Cloud Firestore que usa la app de forma activa, de modo que la app pueda acceder a los datos sin conexión en el dispositivo. Puedes escribir, leer, escuchar y consultar los datos en caché. Cuando el dispositivo vuelve a estar en línea, Cloud Firestore sincroniza los cambios locales que hizo la app con los datos almacenados de forma remota en Cloud Firestore.

Para usar la persistencia sin conexión, no es necesario hacer ningún cambio en el código para acceder a los datos de Cloud Firestore. Cuando está activada la persistencia de datos sin conexión, la biblioteca cliente de Cloud Firestore administra el acceso a los datos en línea y sin conexión de forma automática, y sincroniza los datos locales cuando vuelve a conectarse el dispositivo.

Configura la persistencia sin conexión

Cuando inicialices Cloud Firestore, podrás habilitar o inhabilitar la persistencia sin conexión:

  • En iOS y Android, la persistencia sin conexión está habilitada de forma predeterminada. Para inhabilitar la persistencia, configura la opción PersistenceEnabled con el valor false.
  • En la Web, la persistencia sin conexión está inhabilitada de forma predeterminada. Para habilitar la persistencia, llama al método enablePersistence. Entre sesiones, no se borra automáticamente la caché de Cloud Firestore. Por lo tanto, si la app web administra información confidencial, asegúrate de preguntarle al usuario si se encuentra en un dispositivo de confianza antes de habilitar la persistencia.
Web
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;
  

Supervisa datos sin conexión

Si no tienes conexión en el dispositivo pero está habilitada la persistencia sin conexión, los agentes de escucha recibirán eventos cuando cambien los datos almacenados en la caché local. Puedes supervisar documentos, colecciones y consultas.

Para comprobar si estás recibiendo datos del servidor o de la caché, usa la propiedad fromCache en los SnapshotMetadata del evento de instantánea. Si fromCache es true, los datos provienen de la caché y es posible que sean obsoletos o estén incompletos. Si fromCache es false, los datos están completos y las últimas actualizaciones provienen del servidor.

Según la configuración predeterminada, no se genera ningún evento si solo cambian los SnapshotMetadata. Si confías en los valores de fromCache, especifica la opción de escuchar includeMetadataChanges cuando adjuntes el controlador de escucha.

Web
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);
    }];
  

Obtén datos sin conexión

Si intentas obtener un documento mientras el dispositivo no tiene conexión, Cloud Firestore muestra datos de la caché. Si la caché no contiene datos de ese documento o el documento no existe, la llamada get genera un mensaje de error.

Consulta datos sin conexión

La consulta funciona con la persistencia sin conexión. Puedes recuperar los resultados de las consultas con una operación get directa o mediante escucha, como se describe en las secciones anteriores. También puedes crear nuevas consultas de datos que se conservan en la caché local mientras el dispositivo está sin conexión. Sin embargo, inicialmente, solo se ejecutarán las consultas con los documentos almacenados en caché.

Enviar comentarios sobre...

Si necesitas ayuda, visita nuestra página de asistencia.