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?
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:
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.
La réponse suivante suit le guide officiel dans le lien suivant:
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.