Ă la fin de ce chapitre, vous serez capables de :
Une application mobile nâest pas toujours connectĂ©e Ă Internet :
Pourtant, les utilisateurs sâattendent Ă ce quâelle continue de fonctionner, mĂȘme hors ligne.
La persistance = capacitĂ© dâune application Ă stocker des donnĂ©es localement sur lâappareil, afin quâelles restent disponibles :
Exemples de données persistées :
La gestion du mode offline repose sur 3 briques :
Une application de notes doit permettre :
đŻ Objectif du chapitre :
Comprendre les solutions de stockage et comment assurer le offline sans frustrer lâutilisateur.
Le stockage clĂ©âvaleur = forme de persistance la plus simple.
On enregistre de petites infos sous forme :
clĂ© â valeur
Comme un dictionnaire.
Préférences utilisateur
Petits états internes
Tokens dâauthentification
ParamĂštres de configuration
â ïž Pas adaptĂ© aux donnĂ©es volumineuses (listes, historiques, gros objetsâŠ).
| Plateforme | Outil | Particularités |
|---|---|---|
| Android | SharedPreferences |
Simple, rapide, non chiffré |
| iOS | UserDefaults |
ParamĂštres internes de lâapp |
| Ionic / Capacitor | Preferences |
API JS â natif unifiĂ©e iOS/Android |
| Flutter | shared_preferences |
Stockage léger persistant |
import { Preferences } from '@capacitor/preferences';
await Preferences.set({
key: 'theme',
value: 'dark',
});
Ici, on mĂ©morise le thĂšme choisi par lâutilisateur.
Pour des données plus volumineuses ou structurées, on utilise une base de données locale.
Elle permet :
Utile pour :
| Plateforme | Solution | Description |
|---|---|---|
| Android | Room (sur SQLite) | ORM moderne, facile depuis Kotlin |
| iOS | CoreData | Base orientée objets intégrée |
| Flutter |
sqflite, hive
|
SQLite ou base clĂ©âvaleur rapide |
| Ionic / Capacitor | @capacitor-community/sqlite |
Plugin SQLite natif |
[ UI ] â [ ViewModel / Service ] â [ SQLite / CoreData ]
đŻ IdĂ©e : la vue ne parle jamais directement Ă la base.
Elle passe par une couche intermédiaire (service / ViewModel).
Certaines apps doivent stocker des fichiers :
Ici, ce ne sont plus des âlignes de BDDâ, mais des fichiers sur le stockage.
| Plateforme | API | Utilisation |
|---|---|---|
| Android |
File, MediaStore
|
Gestion fichiers et médias |
| iOS | FileManager |
Dossiers, lecture / écriture |
| Ionic / Capacitor | Filesystem |
API JS â systĂšme de fichiers natif |
| Flutter |
file_picker, path_provider
|
Choix de fichiers, stockage local |
Exemple : une app de scan stocke les documents localement avant upload.
Le cache local permet dâafficher du contenu mĂȘme si :
Câest essentiel pour :
Exemple : Twitter, Instagram ou YouTube affichent le dernier contenu chargé hors ligne.
Cache mémoire (RAM)
Cache disque
| StratĂ©gie | Description | Cas dâusage |
|---|---|---|
| Cache-first | Lire le cache, puis mettre Ă jour en fond | App mĂ©tĂ©o, liste dâarticles |
| Network-first | RĂ©seau dâabord, cache en secours | Chat, donnĂ©es sensibles |
| Stale-while-revalidate | Afficher le cache puis rafraßchir en arriÚre-plan | Réseaux sociaux |
đ§âđ» Conseil dĂ©veloppeur :
Toujours enregistrer un timestamp avec les données du cache.
Comme en restauration :
La synchronisation = garder la cohérence entre :
⊠mĂȘme si lâutilisateur travaille offline.
Principe :
Chaque action utilisateur est enregistrée dans une queue :
Ă la reconnexion :
Chaque enregistrement a un champ du type :
updatedAt En cas de conflit :
Stratégies possibles :
Last Writer Wins
â la derniĂšre modification lâemporte
Serveur prioritaire
â le serveur est lâautoritĂ© finale
Local prioritaire (offline-first)
â on fait confiance Ă ce que lâutilisateur a saisi
Exemple : app de notes â souvent la version locale la plus rĂ©cente prime.
Le réseau mobile est :
Une bonne app anticipe :
Outils fréquents :
ConnectivityManager NWPathMonitor Network connectivity_plus
Permet dâafficher des messages :
Exemple :
Une app de livraison peut empĂȘcher lâenvoi dâune commande hors ligne,
mais continuer dâafficher les menus via le cache.
(clĂ©âvaleur / base de donnĂ©es / fichiers / pas de persistance)
Comprendre oĂč et comment stocker chaque type de donnĂ©e dans une app mobile.
Vous travaillez sur CityQuest, une app de chasse au trésor en ville.
Fonctionnalités :
On se concentre sur les données stockées sur le téléphone :
đŻ Objectif : apprendre Ă choisir le bon type de stockage local.
Pour chaque donnée ci-dessous, indiquez dans quel type de stockage vous la placeriez :
âïž Justifiez chaque choix en 1 phrase.
Ătat dâune quĂȘte pour lâutilisateur
(non commencée, en cours, terminée)
Historique des quĂȘtes terminĂ©es
(dizaines ou centaines dâentrĂ©es)
Cache des quĂȘtes Ă proximitĂ© rĂ©cupĂ©rĂ©es depuis lâAPI
(afficher mĂȘme si le rĂ©seau est lent)
Photo de validation dâune quĂȘte prise par lâutilisateur
Fichiers de logs dâerreur pour envoi ultĂ©rieur au support
(stack traces, messages techniques)
| Donnée | Type de stockage choisi | Justification (1 phrase) |
|---|---|---|
| Token dâauthentification | ⊠| ⊠|
| ParamÚtre du thÚme | ⊠| ⊠|
| ⊠| ⊠| ⊠|
đŹ Lâobjectif est moins dâavoir âla bonne rĂ©ponseâ que de savoir argumenter.
Android Room
https://developer.android.com/training/data-storage/room
iOS CoreData
https://developer.apple.com/documentation/coredata
Capacitor â Storage & SQLite
https://capacitorjs.com/docs
Flutter â sqflite
https://pub.dev/packages/sqflite
W3C â IndexedDB API
https://developer.mozilla.org/docs/Web/API/IndexedDB_API