Persistance, synchronisation et partage des données

J’ai beau chercher sur le net des informations à ce sujet, je m’y perd un peu et ce n’est pas vraiment clair dans mon esprit… Je compte donc sur la communauté pour me conseiller et m’aider à faire le bon choix.

Pour le projet que je souhaite développer en SwiftUI (pour iOS, iPadOS et macOS), j’ai besoin de stocker pas mal de données. Jusqu’ici, dans les versions précédentes (C++ et Python), j’ai utilisé des bases de données classiques SQLite et MySQL (MariaDB en réalité). Cependant, avec la version mobile de cette application, d’autres contraintes s’ajoutent, comme la synchronisation des données entre appareils d’un même utilisateur mais aussi le partage de ces données avec un ou plusieurs utilisateurs de son choix.

C’est là que je bloque : quelle solution de persistance dois-je utiliser pour assurer cette synchronisation et ce partage ?

  • Je pourrai conserver une base SQL multi-utilisateurs, mais elle doit toujours être accessible (pas de mode hors-ligne) et chaque utilisateur (ou groupe) doit gérer sa propre base, ce qui n’est pas à la porter de tous
  • L’utilisation d’un fichier SQLite est tentant, d’autant plus qu’on peut le stocker sur un compte iCloud ou Dropbox par exemple et le partager avec un ou plusieurs utilisateurs. Il est même possible dans ce cas de créer plusieurs jeux de données en parallèle. Mais si le fichier est modifié à plusieurs endroits en même temps, difficile de gérer les conflits si les synchronisations ne sont pas immédiates (ce qui est souvent le cas)
  • Je me suis renseigné sur Realm après avoir testé CoreData, mais je ne vois pas comment gérer la synchronisation et le partage avec la version Legacy et si j’aimerai si possible pouvoir me passer d’un service tiers comme Atlas de MondeDB
  • Je pourrai développer moi-même un service web pour gérer tout ça mais ça me semble être trop long et compliqué pour le faire correctement

Quels sont vos avis ? Avez-vous d’autres solutions à me proposer ?
Je n’ose pas me lancer dans l’écriture du code tant que je ne sais pas comment gérer cet aspect indispensable. Et si ce problème me bloque trop longtemps, j’ai bien peur de perdre ma motivation…

Merci et happy coding!

Bonjour,

Mon retour d’expérience:

  • l’intégration SwiftUI, coreData et CloudKit est extrêmement pratique, et règle de manière très simple pour le développeur la quasi totalité des problèmes de synchronisation entre ce qui est stocké sur l’appareil et dans le nuage ainsi que la synchronisation entre appareils connectés au même compte iCloud
  • Apple a annoncé à la dernière WWDC l’ajout du partage, mais la mise en œuvre avec SwiftUI ne semble pas encore très simple (cf lien ci-dessous). On peut penser que ça viendra, mais c’est un pari à faire (et si tu trouves des solutions, je suis preneur :blush:)

Cordialement
Nicolas

Je pense que le webservice est la meilleure solution dans ton cas. Ca te permet de faire tout ce que tu veux et de maîtriser ta chaîne de bout en bout.
Effectivement c’est un peu de travail mais ça vaut souvent le coup.
Depuis quelques mois je teste une solution qui me plaît de plus en plus : Directus.

J’ai fait une vidéo sur YouTube pour présenter le principe :

C’est un très bon moyen de générer rapidement un webservice pour une base de données SQL.
Je pense faire un cours détaillé sur son installation et son utilisation.

Happy coding!

1 « J'aime »

Super, je ne connaissais pas, merci ! Je vais aller découvrir ça ce week-end.

Juste une question par rapport à la synchronisation et au mode hors-ligne : comment gérer les données en cache sur le client ? Faut-il gérer les données avec Realm par exemple en local et envoyer les requêtes ensuite à l’API (avec horodatage et statut de synchronisation) ou existe-t-il des outils déjà existants s’occupent de ça ?

Plus de l’utilisation de Directus, c’est un cours sur cet aspect qui m’intéresserait beaucoup.

1 « J'aime »

Une base de donnée locale fait parfaitement l’affaire pour ça (real, sqlite, coredata, etc.).
Il existe peut être des librairies open source pour te simplifier la tâche, mais personnellement j’ai tendance à le faire moi-même à chaque projet qui en a besoin.