L'application PETiSoin regorge de données multimédias, primaires et complexes. La seconde étape est d’identifier le bon type de stockage qui correspond à vos besoins. Ici, vous allez découvrir les différents moyens que propose Android pour sauvegarder les données de votre application sur l’appareil de vos utilisateurs (téléphone, tablette, télévision, etc.).
Utilisez une base de données locale
Bases de données locales et bases de données distantes
Stocker des données rime souvent avec base de données. Dans le cadre d’une application mobile, on distingue généralement deux localisations : les bases de données locales et les bases de données distantes.
Bases de données relationnelles et bases de données NoSQL
Les bases de données se regroupent en deux catégories : les bases de données SQL (Structured Query Language) ou relationnelles et les bases de données NoSQL (Not Only SQL).
Les bases de données SQL sont fondées sur un modèle relationnel, où les données sont organisées en tables SQL avec des relations définies entre elles.
Android offre nativement la possibilité d’utiliser une base de données SQL et donc une base de données locale relationnelle via le système de gestion de base de données SQLite. C’est est un système léger et embarqué, qui ne requiert pas de serveur externe et qui est manipulable grâce au langage SQL.
Langage SQL et ORM
Dans le cadre du développement d’une application mobile, lorsque l’on souhaite manipuler une base de données locale native SQLite, deux possibilités se présentent à nous : utiliser le SQLite directement ou utiliser un ORM (Object-Relation mapping).
Le langage SQL permet un contrôle très précis des données contenues dans une base de données. Il permet d'écrire ce que l’on appelle des requêtes, plus ou moins complexes, afin de réaliser différentes opérations sur les données (lire, filtrer, agréger, insérer, modifier, supprimer, etc.).
Le langage SQL nécessite une certaine expertise et peut s'avérer verbeux, voire laborieux pour réaliser des tâches simples. C'est là qu'interviennent les ORM qui agissent comme une couche d'abstraction entre le modèle objet de l'application et la base de données. Les ORM simplifient grandement le code !
Room
S’il existe plusieurs ORM sur Android, il en existe un “officiel” directement développé par Google : Room.
Nous reviendrons en détail sur l’utilisation de Room au sein d’une application mobile Android dans la partie “Créez une base de données locale avec Room”. Néanmoins, nous pouvons dès maintenant nous attarder sur son fonctionnement.
Room se base principalement sur un système d’annotation pour générer automatiquement du code. En tant que développeur, vous allez pouvoir vous concentrer uniquement sur la logique métier de votre application et moins sur l’implémentation technique et l’écriture de requêtes SQL. Notez que ce système d’annotation ne rend pas l’outil moins puissant pour autant puisqu’il supporte une manipulation avancée des bases de données relationnelles via, par exemple, l’utilisation des jointures ou des agrégats.
Grâce à cette génération de code et de requêtes SQL, la bibliothèque Room permet également de réduire les erreurs de manipulation de votre base de données en faisant notamment des vérifications automatiques lors de la compilation.
De nombreuses applications, disponibles sur le Google Play Store, utilisent une base de données et plus particulièrement l’ORM Room. C’est notamment le cas de l’application Now in Android de Google. L’objectif de cette application est de présenter le contenu de la série consacrée au développement Android, Now in Android. Les utilisateurs de l’application peuvent parcourir des liens vers des vidéos, articles et autres contenus récents. Ils peuvent également suivre des sujets qui les intéressent et être avertis de la publication de nouveaux contenus correspondant à leurs centres d'intérêt. Cette application utilise Room pour persister, c'est-à-dire sauvegarder de manière durable, l’ensemble du contenu de l’application.
Utilisez les préférences utilisateur
Utiliser une base de données pour stocker des données localement est une solution efficace car elle permet de :
mettre partiellement à jour des données ;
respecter des contraintes d’intégrité référentielle et ;
prendre en charge un ensemble de données volumineuses et complexes.
Mais c’est également une solution qui peut s’avérer exagérée et complexe à mettre en place lorsque l’on souhaite stocker des données plus simples.
C’est là qu'entrent en scène les préférences utilisateur.
Dans le cadre de l’application PETiSoin, ce système peut, par exemple, permettre de stocker les préférences de l’utilisateur en termes de notifications. La clé pourrait êtreareNotificationsEnabled
et la valeur true
oufalse
en fonction de la préférence.
SharedPreferences
Parmi les options les plus populaires pour stocker ces ensembles de clés-valeurs, on trouve deux solutions techniques : les SharedPreferences et les Preferences DataStore.
Les SharedPreferences sont la solution historique d’Android. Il s’agit de la solution technique la plus simple à implémenter et à utiliser au sein de vos applications Android.
Cette solution technique présente l’avantage d’exposer une API synchrone qui est à l’origine de sa facilité d'utilisation.
Cependant, elle présente aussi plusieurs limitations. Tout d’abord, les SharedPreferences ne permettent de stocker que certains types primitifs du langage Java et par extension, certains types basiques du langage Kotlin. Il n’est donc pas possible d’y stocker tout ce que vous voulez. Un autre point négatif de cette solution est l’absence de la gestion des transactions. Cela signifie que si deux threads ou processus différents tentent de modifier simultanément la même valeur, le résultat final dépend de l'ordre d'exécution de ces threads. Cette gestion peut conduire à des valeurs inattendues ou incohérentes. Voici les types de variable supportés par les SharedPreferences.
Java | Kotlin |
|
|
DataStore
Si les SharedPreferences sont la solution historique, il ne s’agit pas pour autant de la solution recommandée aujourd’hui par Google, qui demande aux développeurs de privilégier les Preferences DataStore qui font partie de la suite Android Jetpack.
Les Preferences DataStore sont, sur le papier, semblables aux SharedPreferences. Il existe néanmoins quelques différences notables. La première différence importante est la gestion des transactions. Le risque d’obtenir des valeurs inattendues ou incohérentes est plus limité. La seconde différence est l’absence d’une API synchrone au profit d’une API asynchrone.
Les types de variable supportés par les Preferences DataStore (Kotlin) |
|
Quand on parle de DataStore, on parle effectivement souvent des Preferences DataStore. Notez qu’il existe une seconde bibliothèque nommée Proto DataStore. Si ces deux bibliothèques sont très similaires, la bibliothèque Proto DataStore offre ce que l’on appelle la sécurité des types. Cela signifie que la bibliothèque protège l’utilisation d’une même clé pour stocker des types de données différents.
À titre d’exemple, l’application Android Now in Android de Google utilise les préférences utilisateur pour stocker localement l’ensemble des sujets suivis par l’utilisateur courant de l’application.
Utilisez un système de fichiers
Le dernier moyen de stocker localement des données sur les appareils de vos utilisateurs est le système de fichiers.
Prenons l’exemple de données qui seraient stockées dans un fichier texte. L’application mobile qui voudrait les exploiter est obligée de charger le contenu complet du fichier pour en extraire les données qui l’intéresse vraiment.
Dans le cas d’une liste, si l’on souhaite extraire une unique ligne, il est nécessaire de charger l’intégralité du contenu du fichier dans la mémoire vive du terminal de l’utilisateur pour en extraire la ligne que l’on souhaite. Si on avait utilisé une base de données, via le langage SQL, il aurait été possible de lui déléguer ce travail d’extraction pour obtenir directement et simplement le résultat souhaité.
Quand on parle de système de fichiers, sur Android, on distingue généralement deux espaces de stockage : le système de stockage interne et le système de stockage externe.
Chacun des espaces de stockage présente des avantages et des inconvénients distincts que vous devez avoir en tête.
Fonctionnalité | Stockage interne | Stockage externe |
Accessibilité des données | Uniquement votre application |
|
Sécurité des données | Élevée car son accès est limité à votre application | Moins élevée car les données sont accessibles par d’autres applications et l’utilisateur |
Espace de stockage | Limité à la mémoire interne du téléphone | Inclut la mémoire interne du téléphone, mais aussi d'autres formes de stockage amovibles ou extensibles (ex : carte SD et Cloud) |
Durée de vie des données | Fichiers supprimés lors de la désinstallation de l'application | Fichiers conservés lors de la désinstallation de l'application |
Exemple d’utilisation |
|
|
Dans le cadre de l’application PETiSoin, on peut imaginer que les images des animaux de compagnie d’un utilisateur sont stockées sur l’espace de stockage interne car l’intérêt de les exposer à d’autres applications est limité.
En revanche, si on prend une application comme WhatsApp, on s’aperçoit que les médias des conversations sont stockés sur l’espace de stockage externe. C’est pour cette raison que vous pouvez les visualiser dans d’autres applications comme l’application de type “galerie photos” installée par défaut sur les téléphones mobiles.
À vous de jouer !
Contexte
Reprenons la rubrique “Santé” de l’application PETiSoin qui permet aux propriétaires d’un animal de compagnie d’enregistrer, entre autres, les exercices quotidiens de leurs animaux à travers des notes.
Comme vous le savez, chaque animal présente un certain nombre de caractéristiques, comme :
un type (chat, chien, lapin) ;
une race (Persan, Siamois, Golden Retriever, Lapin Nain, Géant des Flandres, etc.) ;
un poids en kilogrammes ;
une taille en centimètres et ;
une couleur.
Un utilisateur peut aussi ajouter les exercices quotidiens de son animal et notamment les informations suivantes comme :
la durée des exercices en minutes ;
le type d’exercice (promenade en forêt, canicross, etc.) parmi une liste prédéfinie de valeurs et ;
la date et l’heure de début de l’exercice.
Consignes
Déterminez le moyen de stockage local (base de données, préférences utilisateur, système de fichiers) le plus adapté à vos besoins et à ceux de vos utilisateurs. Justifiez votre choix.
Livrables
Vous pouvez rédiger votre réponse au format texte.
En résumé
Les bases de données sont à privilégier pour stocker des données complexes et structurées.
Les préférences utilisateur, via les SharedPreferences ou les Preferences DataStore, sont parfaites pour stocker des données primitives ou basiques et simples.
Le système de fichiers, via le stockage interne et externe, offre la possibilité de stocker des données sous forme de fichier.
Vous avez maintenant toutes les connaissances autour des solutions de stockage local pour votre application mobile. Nous pouvons à présent attaquer l’implémentation d’une base de données relationnelle en utilisant l’ORM Room.