iOS Firestore, grosse base de donnée, besoin hors-ligne, mais pas tout

Bonjour tout le monde,

J’aimerai utiliser Firestore (Firebase) dans mon application, mais je me pose une question au niveau de l’impact que celait aura sur mes utilisateurs.

J’ai une base de donnée, assez grosse, pour laquelle j’ai besoin que les utilisateurs aient un accès hors ligne à certaines parties de la base de donnée.
Rendre toute la base de donnée hors ligne n’est pas un problème, mais est-ce que je peux rendre certaines parties hors-ligne et d’autres parties accessible uniquement en ligne ?

Et si je rends toute la base de donnée disponible hors ligne sur l’iPhone des utilisateurs, comment est-ce que cela va se passer si la base de donnée contient environ 1.000.000 d’entrées ? Est-ce que ce ne sera pas trop lourd ?

Si vous avez des questions, ou des suggestions, ou tout autres commentaires, je suis preneur…

Un grand merci,
Bonne journée,

Alexandre

Hello Alexandre,

Est-ce que ce sont des données statiques ou dynamiques que tu veux rendez accessibles hors-ligne ?
Car, j’avais essayé dans un projet de le faire avec Realtime Database (pas Firestore) et au moment de la resynchro des données, c’était un peu le foutoir, beaucoup d’erreurs qui menaient à de la désynchro donc j’ai abandonné.
Maintenant, il y a peut-être de nouvelles possibilités avec Firestore ou alors de nouvelles fonctions qui sont sorties depuis mais pour le moment je n’ai pas réessayer.
Je n’ai pas encore touché à Firestore, c’est pour mon prochain projet :slight_smile:

Hello @schtipoun,

Il y a une partie de donnée statiques (pour celles là, je ne m’en fais pas trop), mais il y a aussi des données dynamiques qui sont menées à évoluer avec l’utilisateur de l’iPhone ainsi que les autres utilisateurs de l’application.

J’imagine qu’il doit exister une solution, sinon, comment faire dans le cas d’un chat par exemple ? Forcer la connexion internet, ou télécharger tous les messages de tous les utilisateurs ? Ca me semble spécial qu’ils n’aient pas pensé à ce genre de cas…
Je vais continuer de chercher et de me renseigner.

Si tu as une idée ou autre, je suis tout à l’écoute :slight_smile:

Bonne journée,

Pour l’exemple d’un chat par exemple, ce que je voulais dire c’est que si tu es hors-ligne au moment où tu veux envoyer ta réponse, quand tu retrouveras du réseau pour uploader les données dans la base, ce n’est pas sûr qu’elle se mettra au bon endroit (elle prendra peut-être l’heure de l’upload par exemple et pas celle à laquelle tu as rédigé le message).

Oui, et puis même, je ne peux pas sauvegarder tous les messages de tous les utilisateurs de l’application dans la base de donnée locale de l’utilisateur…

Mais je vois ce que tu veux dire… Embêtant, en effet…

Ça dépend vraiment de l’usage qu’il y a derrière et si il est important dans l’expérience de ton application que des informations puissent être consultées, mises à jour, etc. de manière fiable.
Le hors-ligne est encore en délicatesse là-dessus.

Merci pour la réponse :slight_smile:

Quelles autres options est-ce que j’ai pour un système en ligne/hors ligne ?

Alors ça c’est une bonne question car j’ai complètement abandonné le projet où j’avais commencé à regarder les solutions pour ça car, justement, je savais que je n’allais jamais arriver au niveau de satisfaction que je voulais pour les utilisateurs donc je n’ai pas creusé depuis.

Après, si tu en dis un peu plus sur ton app, y’a peut-être d’autres moyens que le hors-ligne ?

En gros, c’est une sorte de “marché” dans lequel les utilisateurs doivent pouvoir gérer leurs stocks hors ligne, puis le côté en ligne permet d’échanger avec d’autres utilisateurs. Le coté hors ligne est absolument nécessaire, malheureusement…

Après, si la synchronisation ne fonctionne pas à la seconde prêt, c’est pas trop grave, sur ce point, je sais m’arranger.

Ma principale inquiétude, c’est le stockage des données, pour ne pas devoir stocker l’entièreté de la base de donnée hors ligne… 1.000.000 d’entrées stockées en hors ligne alors que l’utilisateur n’a besoin que de 1.000 entrées, c’est un peu bête je trouve.

Tu ne peux pas rendre disponible en hors-ligne seulement les données de l’utilisateur et ne pas tout redescendre de façon systématique ?

Oui, c’est ce que j’aimerai faire, mais je ne sais pas si c’est possible, et si ça l’est, comment…

Parce que par exemple, si je fais une requête qui lit X entrées, est-ce que Firestore mets automatiquement ces données en cache, et donc sur le device de l’utilisateur ? Ou pas forcément ?

Je cherche encore dès que j’ai du temps :slight_smile:

C’est une bonne question, je ne sais pas si dans ces cas là, il redescend tout.
Je pense qu’il ne télécharge que le snapshot pour faire les traitements donc j’aurais tendance à penser qu’il ne rend que ça dispo en hors-ligne mais il faut faire des tests pour en être sur.
Surtout si ensuite, tu as des centaines de milliers d’entrées, il ne faudrait pas que la taille de ton app explose.

Tu as commencé par activer le isPersistenceEnabled = true c’est ça ?

Oui, exactement, et puis s’il redescend tout, ça risque de poser un soucis aussi avec le pricing de Firebase…

Tu as commencé par activer le isPersistenceEnabled = true c’est ça ?

De ce que j’ai lu, avec Firestore pour iOS, c’est activé par défaut, contrairement au temps de Firebase, ou à la version Web de Firestore.
Mais oui, cette option est activée. :slight_smile:

Sur la documentation de Firebase, y’a pas mal de choses intéressantes.
Notamment le fait que le cache est limité à 10MB et que si ça dépasse cette taille, ça veut dire que le début de la base sera écrasée pour laisser place à la fin de la base.
Et ils vantent les mérites de la partie keepSynced mais ça n’a jamais vraiment bien marché pour moi. C’était il y a presque 2 ans maintenant donc y’a peut-être eu des améliorations depuis.
Apparemment, maintenant, tu peux même faire des query sur les datas en offline ce qui n’était pas le cas “à l’époque”.

Outch, cela pose un énorme problème en fait… Parce que du coup, si après 10Mb, ca écrase le début, cela veut dire que l’utilisateur “perd” les données qu’il doit toujours avoir en local… Il devrait alors aller les rechercher en ligne, mais ce n’est pas du tout ce qui m’arrange…

Pour la partie keepSynced, oui, mais de nouveau, je ne pense pas l’utiliser, sinon risque de soucis niveau du pricing à terme (j’ai lu un cas qui est arrivé entre autre à cause de cette option).

Bon, peut-être que la meilleur solution, c’est d’utiliser Firebase uniquement en ligne, et puis peut-être Realm pour la partie hors-ligne… Mais j’espérais éviter de mêler deux systèmes de base de données différentes…

Après, 10MB pour une base de données Firebase c’est énorme !
Vu que c’est de la donnée à plat dans un format NoSQL, ça n’a rien à voir avec les tailles de base de données “classiques”. Tu peux tester et voir combien fait ta base une fois téléchargée mais tu peux avoir une bonne surprise.

Je vais effectivement commencer par faire ça, pour mieux me rendre compte. :slight_smile:

Mais dans tous les cas, je devrais surveiller la taille de ma base de donnée, parce que si à un moment donné ça arrive, cela pourrait être ennuyant pour les utilisateurs.

Je continue de creuser, merci ! :smiley:

Clairement, l’intégrité c’est la base !

Bon courage :slight_smile:

@schtipoun Est-ce que tu saurais me dire où tu as vu ça ? Je n’arrive pas à tomber dessus…

J’ai peut-être des pistes de solutions. Je confirme d’abord ce que j’ai trouvé et ensuite je mettrais un récapitulatif ici ! :smiley:

Tu as ces deux pages :
https://firebase.google.com/docs/database/ios/offline-capabilities
https://firebase.google.com/docs/firestore/manage-data/enable-offline