Le stockage de données est l'une des tâches clés d'une application mobile, affectant les performances, la sécurité et l'expérience utilisateur. Dans cet article, nous aborderons SQLite, Room, Core Data, Realm, Firebase Firestore, SharedPreferences, DataStore, Keystore et Keychain, ainsi que les formats de sérialisation (JSON, Protobuf) et les bibliothèques (Gson, Moshi, kotlinx.serialization). Ce guide aidera les développeurs débutants à choisir la bonne solution de stockage de données. Pour en savoir plus, consultez le guide officiel Android sur le stockage de données.
Points clés
Pour stocker des données structurées avec des relations entre entités, on utilise des bases de données relationnelles.
SQLite est une base de données relationnelle embarquée qui fonctionne sur toutes les plateformes mobiles. Elle ne nécessite pas de serveur séparé et les données sont stockées dans un seul fichier. SQLite est la base de Room (Android) et optionnellement de Core Data (iOS). Bibliothèques : android.database.sqlite (Android), FMDB/Core Data (iOS), sqflite (Flutter).
Room est la bibliothèque officielle d'Android Architecture Components pour travailler avec SQLite. Elle fournit une couche ORM : Entity (table), DAO (requêtes), Database (point d'entrée). Room vérifie les requêtes SQL à la compilation, prend en charge les coroutines et Flow, et migre automatiquement le schéma.
@Entity data class User( @PrimaryKey val id: Int, val name: String, val email: String ) @Dao interface UserDao { @Query("SELECT * FROM user WHERE id = :id") suspend fun getUser(id: Int): User? }
Core Data est le framework d'Apple pour gérer un graphe d'objets. Ce n'est pas une base de données pure — c'est une couche de persistance au-dessus de SQLite, XML ou de stockage binaire. Core Data gère les objets (NSManagedObject), les relations, le versionnement de schéma, l'annulation/répétition et le multithreading via NSManagedObjectContext.
Realm est une alternative à SQLite, conçue comme une base de données mobile haute performance. Realm est plus rapide que SQLite en lecture et écriture, prend en charge les notifications réactives (Live Objects), le chiffrement à la volée et le multiplateforme (Android, iOS, Flutter, React Native). Inconvénients : taille APK/IPA augmentée et consommation mémoire plus élevée.
Pour stocker de petites quantités de données (paramètres, tokens, cache), on utilise des magasins simples de paires clé-valeur.
SharedPreferences est un magasin legacy de paires clé-valeur sous Android. Inconvénients : accès synchrone (bloque l'interface lors de la lecture), absence de typage, risque d'ANR lors du chargement de fichiers volumineux. NON recommandé pour les nouveaux projets.
DataStore est le remplacement moderne de SharedPreferences par Google. Il fonctionne de manière asynchrone via Kotlin Coroutines et Flow, prend en charge Preferences DataStore (clé-valeur) et Proto DataStore (données typées via Protobuf). DataStore est sûr pour le thread UI et prend en charge les transactions.
UserDefaults est le stockage standard pour les petits réglages sous iOS. Il prend en charge les types primitifs, les chaînes, les dates, Data. UserDefaults est synchrone, donc inadapté aux grands volumes de données. L'enregistrement de valeurs via register(defaults:) définit les valeurs par défaut.
Pour le stockage de données dans les applications nécessitant une synchronisation entre appareils, les bases de données cloud Firebase sont utilisées.
Firebase Firestore est une base de données documentaire NoSQL avec abonnements en temps réel, mise à l'échelle automatique, requêtes puissantes et mode hors ligne intégré. Les données sont organisées en collections et documents (structures similaires à JSON). Firestore prend en charge les transactions et les opérations par lots. Idéal pour les chats, flux et applications sociales.
Firebase Realtime Database est une base de données NoSQL plus ancienne de Firebase qui stocke les données sous forme d'un seul arbre JSON. Plus simple que Firestore mais moins flexible en requêtes et mise à l'échelle. Recommandée pour les applications temps réel simples (statut en ligne, chats simples).
| Caractéristique | Cloud Firestore | Firebase Realtime DB |
|---|---|---|
| Modèle de données | Collections → Documents | Arbre JSON |
| Requêtes | Complexes (filtrage, tri, limites) | Simples (par clé) |
| Mise à l'échelle | Automatique | Partitionnement manuel |
| Mode hors ligne | Oui (cache persistant) | Oui |
| Tarification | Par opérations de lecture/écriture | Par trafic + stockage |
Le stockage de tokens, mots de passe et clés de chiffrement nécessite des stockages protégés spéciaux.
Android Keystore est un stockage système pour les clés cryptographiques. Les clés sont stockées dans un environnement matériel (TEE — Trusted Execution Environment), inaccessible aux applications et à l'OS. Il prend en charge la génération de clés, le chiffrement et la signature. Android 9+ inclut StrongBox Keymaster (puce dédiée).
Keychain Services est un stockage sécurisé iOS pour mots de passe, clés et certificats. Les données sont chiffrées à l'aide du Secure Enclave matériel. Keychain prend en charge les niveaux d'accessibilité : Always, WhenUnlocked, WhenUnlockedThisDeviceOnly, AfterFirstUnlock.
EncryptedSharedPreferences est un wrapper autour de SharedPreferences avec chiffrement des clés et valeurs via AES256-GCM et HKDF. Implémenté dans la bibliothèque AndroidX Security. Recommandé pour stocker les tokens et les paramètres sensibles.
Chez IT Sectr, nous utilisons Android Keystore + EncryptedSharedPreferences pour stocker les tokens d'actualisation et les clés biométriques. Sous iOS, nous utilisons Keychain avec le niveau kSecAttrAccessibleWhenUnlockedThisDeviceOnly pour une sécurité maximale.
Pour le stockage de fichiers (images, vidéos, documents), les plateformes mobiles proposent plusieurs types de stockage.
Android distingue le Internal Storage (/data/data/package/ — stockage privé) et l'External Storage (carte SD ou partition émulée). Cache Directory est un stockage temporaire que le système peut vider. Scoped Storage (Android 10+) restreint l'accès à l'External Storage — les applications ne voient que leurs propres fichiers ou les fichiers via MediaStore/SAF.
iOS fournit le Documents Directory (sauvegarde iCloud, données persistantes), Library/Caches (fichiers temporaires, non sauvegardés) et Tmp Directory (temporaires, peuvent être vidés). Utilisez NSFileManager pour travailler avec le système de fichiers. iOS 11+ prend en charge File Provider pour les fichiers cloud.
La sérialisation convertit les objets en un format pour la transmission ou le stockage. La désérialisation est le processus inverse.
JSON (JavaScript Object Notation) est le format le plus populaire : lisible, flexible, supporté par toutes les plateformes. XML est plus strict, utilisé dans les systèmes legacy. Protobuf (Protocol Buffers) est un format binaire de Google : 3 à 10 fois plus compact que JSON, analyse plus rapide, avec un schéma strict. Utilisé pour les systèmes à forte charge et les microservices.
JSONSerialization est l'API intégrée pour travailler avec JSON. Codable (Encodable/Decodable) est un protocole Swift moderne pour la sérialisation automatique en JSON, Property List et autres formats.
struct User: Codable { let id: Int let name: String let email: String } let user = User(id: 1, name: "Alice", email: "alice@example.com") let encoder = JSONEncoder() let jsonData = try encoder.encode(user)
Pour Flutter et React Native, il existe des bibliothèques de stockage efficaces dédiées.
Hive est un magasin clé-valeur léger et rapide pour Flutter. Il ne nécessite pas de code natif (Dart pur), prend en charge le typage via TypeAdapter et fonctionne dans des isolates. Idéal pour le cache, les paramètres et les petits volumes de données.
ObjectBox est une base de données embarquée haute performance pour Flutter, Android et iOS. Elle est 10 fois plus rapide que SQLite et utilise une structure de fichier plat pour une surcharge minimale. Prend en charge les relations, les requêtes et les abonnements réactifs (ObjectBox Dart).
Drift est une bibliothèque SQLite réactive pour Flutter et Dart. Elle fournit des requêtes type-safe, des migrations, des fonctions DAO et un support Stream (mises à jour réactives). Drift est le choix principal pour les projets Flutter nécessitant SQLite.
Foire aux questions
Le choix dépend de la plateforme : Room (Android) est la bibliothèque officielle basée sur SQLite avec vérification des requêtes à la compilation. Core Data (iOS) est le framework d'Apple avec un graphe d'objets. Pour les projets multiplateformes, Realm ou SQLite via ORM conviennent.
SharedPreferences est une ancienne implémentation avec accès synchrone et risque d'ANR. DataStore (Jetpack) est un remplacement moderne basé sur Kotlin Coroutines et Flow, supportant l'asynchronisme, le typage et la protection contre les erreurs.
Android : EncryptedSharedPreferences ou Android Keystore. iOS : Keychain Services avec accessibilité WhenUnlockedThisDeviceOnly. Pour les données critiques, utilisez Secure Enclave (iOS) et Keystore matériel (Android) avec biométrie.
Cloud Firestore est une base de données NoSQL de Firebase avec synchronisation en temps réel, mode hors ligne et mise à l'échelle automatique. Adapté aux chats, flux d'actualités et projets nécessitant une synchronisation entre appareils.
Flutter : Hive (clé-valeur rapide), Floor (ORM SQLite), Drift (Moor, SQLite réactif), ObjectBox (BD embarquée haute performance). React Native : Realm, WatermelonDB (chargement paresseux) et AsyncStorage (analogue à SharedPreferences).
Résumé
Nous développerons une application mobile clé en main
IT Sectr crée des applications iOS et Android pour les startups et les entreprises depuis 2017. Nous vous conseillerons et vous proposerons la meilleure solution.