web-dev-qa-db-fra.com

Cache hors ligne Firestore

Je crée une Android qui doit fonctionner hors ligne pendant des semaines, mais peut se synchroniser immédiatement avec une base de données distante lorsqu'elle se connecte.

Ma question est: Firestore peut-il être une bonne option pour cela? Combien de temps Firestore conserve-t-il son cache hors ligne?

17
Balazs Fabian

Firestore peut être configuré pour conserver les données pour une telle utilisation déconnectée/hors ligne. Je vous recommande de lire la section activer la persistance hors ligne dans la documentation, qui contient cet exemple d'activation de cette fonctionnalité:

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

Cette persistance est en fait activée par défaut sur Android et iOS, donc l'appel ci-dessus n'est pas nécessaire.

Vous Android qui interagit avec la base de données sera le même que vous soyez connecté ou non, car le SDK fonctionne simplement de la même manière. Si vous souhaitez détecter si les données proviennent du cache ( et donc potentiellement périmé), lisez la section Écoutez les données hors ligne dans la documentation.

Les données du cache n'expirent pas après un certain temps. Les deux seules raisons pour lesquelles les données sont supprimées du cache:

  1. Les données ont été supprimées du serveur, auquel cas le client les supprimera du cache disque.
  2. Le client doit purger son cache disque pour libérer de l'espace pour des données plus récentes.
7
Frank van Puffelen

Si vous écoutez des données dans Cloud Firestore, vous obtiendrez des instantanés immédiats des données mises en cache et également des mises à jour lorsque votre application pourra se connecter en ligne:

final DocumentReference docRef = db.collection("cities").document("SF");
docRef.addSnapshotListener(new EventListener<DocumentSnapshot>() {
    @Override
    public void onEvent(@Nullable DocumentSnapshot snapshot,
                        @Nullable FirebaseFirestoreException e) {
        if (e != null) {
            Log.w(TAG, "Listen failed.", e);
            return;
        }


        // Determine if the data came from the server or from cache
        String source = snapshot != null && snapshot.getMetadata().hasPendingWrites()
                ? "Local" : "Server";


        // Read the data
        if (snapshot != null && snapshot.exists()) {
            Log.d(TAG, source + " data: " + snapshot.getData());
        } else {
            Log.d(TAG, source + " data: null");
        }
    }
});

La persistance est activée par défaut, ce comportement ne nécessite donc aucune configuration.

1
Sam Stern

La réponse suivante suit le guide officiel dans le lien suivant:

Gestion de la taille du cache

FirebaseFirestoreSettings settings = new FirebaseFirestoreSettings.Builder()
    .setCacheSizeBytes(FirebaseFirestoreSettings.CACHE_SIZE_UNLIMITED)
    .build();
db.setFirestoreSettings(settings);

Le code ci-dessus a un indicateur défini pour setCacheSize (), ce qui empêchera l'effacement de votre cache. Vous pouvez également spécifier la même taille. Si vous ne le définissez pas par défaut, la taille est de 100 Mo.

Selon le guide, il existe une méthode pour vérifier si les données que vous interrogez proviennent du cache ou du magasin de pompiers. De plus, dès que votre appareil est de nouveau en ligne, le pare-feu actualise le cache et conserve les données synchronisées.

Pour répondre à votre question, comme vous devez travailler avec des données hors ligne pendant des semaines, je suggère chaque fois que les données sont récupérées pour les stocker au format json/xml, car le stockage d'une énorme quantité de données dans le cache n'est pas une très bonne approche quand on y pense en termes de performances.

J'espère que je vous ai aidé à clarifier certaines choses.

0
Harsh Patalia