web-dev-qa-db-fra.com

Firestore - Utilisation du cache jusqu'à la mise à jour du contenu en ligne

Je commence par Firestore. J'ai lu des documents et des didacticiels sur la persistance des données hors ligne, mais je ne sais pas vraiment si Firestore télécharge à nouveau les données même si le contenu n'a pas été modifié. Par exemple, si j'ai une requête où les résultats seront mis à jour une fois par semaine et que je n'ai pas besoin que l'application télécharge à nouveau le contenu jusqu'à ce que les modifications soient apportées, quelle est la meilleure façon en termes d'efficacité d'écrire le code? Merci!

14
Diego Garcia

Vous souhaitez utiliser l'API "snapshot listener" pour écouter votre requête: https://firebase.google.com/docs/firestore/query-data/listen#listen_to_multiple_documents_in_a_collection

Voici un exemple de 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(", "));
    });

La première fois que vous attachez cet écouteur, Firestore accède au réseau pour télécharger tous les résultats dans votre requête et vous fournit un instantané de requête, comme vous vous en doutez.

Si vous attachez le même écouteur une deuxième fois et que vous utilisez la persistance hors ligne, l'écouteur sera immédiatement déclenché avec les résultats du cache. Voici comment vous pouvez détecter si votre résultat provient du cache ou du local:

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

Après avoir obtenu le résultat mis en cache, Firestore vérifiera avec le serveur pour voir s'il y a des changements dans le résultat de votre requête. Si oui, vous obtiendrez un autre instantané avec les modifications.

Si vous souhaitez être averti des modifications qui impliquent uniquement des métadonnées (par exemple, si aucun document ne change, mais snapshot.metadata.fromCache modifications), vous pouvez utiliser QueryListenOptions lors de l'émission de votre requête: https://firebase.google.com/docs/reference/Android/com/google/firebase/firestore/QueryListenOptions

8
Sam Stern