Suite à l'organisation avec les DAOs, vous devez configurer la base de données. Cette configuration intègre les entités et les DAOs que nous avons créés ensemble. Notre objectif est d’assurer un stockage efficace et une récupération rapide des données en mode hors-ligne.
Analysez votre besoin
Encore une fois, avant de foncer tête baissée dans le code, prenons le temps de comprendre ce qu’implique la création d’une base de données SQLite via Room.
La création d’une base de données SQLite via Room s’accompagne d’un peu de configurations.
Choisissez le stockage des données
Room offre deux options pour le stockage des données : sur le disque ou dans la RAM.
Dans le cas du stockage des données sur le disque, les données sont stockées dans un fichier SQLite (un fichier .db) lui-même stocké sur le système de fichier du terminal de l’utilisateur. Cette option permet une persistance à long terme puisque les données sont persistées entre deux lancements de l’application.
Dans le cas du stockage des données dans la RAM, on parle d’ “in memory database”. Cette option stocke les données dans la mémoire vive du terminal de l’utilisateur. Cette option ne permet donc pas une persistance à long terme puisque les données sont perdues dès lors que l’application est fermée ou tuée.
Gérez le threading
Par défaut, Room garantit que l’accès à la base de données ne se fait jamais sur le thread principal, favorisant ainsi l’utilisation d’un thread adapté aux opérations d’entrées/sorties (I/O : in/out en anglais).
Dans le cadre de la manipulation de la base de données, l’utilisation du thread principal peut le bloquer et déclencher une ANR (Application Not Responding), signalant que l’application ne répond plus.
Malgré cette garantie, Room offre tout de même la possibilité de désactiver la vérification des requêtes sur le thread principal pour Room.
Pré-embarquez les données
Comme toute base de données, lors du premier lancement de votre application et donc lors de la création de la base de données, celle-ci sera vide. Il est parfois nécessaire de vouloir pré-embarquer des données.
Room vous offre alors plusieurs possibilités comme :
Insérer des données statiques à l’aide de requêtes SQL à la création de la base de données ou ;
Créer votre base de données sur la base d’une base de données SQLite (fichier.db) existante.
Gérez de la migration
Votre application mobile, à l’image de l’application PETiSoin, doit évoluer au fur et à mesure des différentes mises à jour (ajout de fonctionnalités). Ces mises à jour peuvent entraîner une évolution du modèle objet de l’application et, par conséquent, faire évoluer la structure de la base de données.
Si Room propose un système de migration automatique pour faciliter la mise à jour du schéma de votre base de données, il offre également la possibilité de gérer manuellement la migration des données et de la structure de la base de données. L’objectif est d'éviter toutes pertes de données.
Configurez la base de données de l’application PETiSoin
Dans le cadre de la base de données de l’application PETiSoin nécessaire au fonctionnement de la fonctionnalité de manipulation des animaux et de leur note, les choix de configuration suivants sont faits.
Puisque l’on souhaite retrouver les données des utilisateurs entre deux lancements de l’application, la base de données sera stockée sur le système de fichiers du terminal de l’utilisateur.
Côté threading, il convient de respecter les recommandations de Room. Aussi, nous ne désactiverons pas la vérification des requêtes sur le thread principal.
Pré-embarquer des données n’est pas nécessaire.
Puisqu’il s’agit de la première version de l’application, la gestion de la migration ne sera pas nécessaire.
Liez vos DAO à la base de données
Maintenant que l’analyse du besoin de la base de données de l’application PETiSoin est faite, nous pouvons passer à l’implémentation technique.
Créez une classe abstraite
La première étape consiste à créer une classe abstraite qui hérite de la classeRoomDatabase
. Cette classe, que l’on peut appeler par exemple PETiSoinDatabase
, fait office de conteneur pour la base de données.
À noter que si la classe est abstraite, c’est que Room se chargera de créer l'implémentation à votre place.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Renseignez les DAO sous forme de fonction abstraite
À ce stade, malheureusement, Room n’est pas capable d’identifier les DAOs avec lesquels il doit travailler dans le cadre de la base de données. Il convient donc de les renseigner, sous la forme de fonctions abstraites, au sein de cette classe conteneur.
Pour chacun des DAOs que l’on souhaite lier à la base de données, il est nécessaire d’écrire une fonction abstraite dont le retour est le DAO à référencer. Dans le cas de l’application PETiSoin, les deux DAOs à référencer sontAnimalDao
et NoteDao
.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Liez vos entités à la base données
Les DAOs sont maintenant correctement liés à la base de données, un travail similaire est à faire avec les entités. L’implémentation technique est cependant différente.
Annotez et paramétrez la classe abstraite de la base de données
Afin de lier les entités à la base de données, il est nécessaire d’utiliser une annotation sur la classe abstraite servant de conteneur pour la base de données :@Database
.
Cette annotation, accepte plusieurs paramètres dont unentities
qui permet de lier les entités à la base de données. Cet attribut accepte un tableau dans lequel les entités sont référencées via leur classe. Dans le cadre de la base de données PETiSoin, les entités à référencer sontAnimal
etNote
.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Ajoutez un numéro de version à votre projet avant la compilation
Comme vous avez pu le voir, l’application ne compile pas. Ce message d’erreur doit s’afficher dans Android Studio.
error: annotation @Database is missing a default value for the element 'version'
C’est assez explicite : l’attributversion
de l’annotation@Database
est manquant. Il convient donc de l’ajouter. Cet attribut permet d’indiquer le numéro de la version de la base de données. Dans le cas de l’application PETiSoin, puisqu’il s’agit de la première version, le numéro sera 1.
Par la suite, chaque fois que vous modifiez le schéma de la table de base de données, vous devez augmenter le numéro de la version.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Exportez le schéma de votre base de données
Finalement, bien que ce ne soit pas obligatoire, il est recommandé d'avoir un historique des versions des schémas de votre base de données et de les déposer sur votre gestionnaire de code source. Pour configurer l’export du schéma de votre base de données, il convient d’utiliser l’attribut exportSchema
qui accepte comme valeur un booléen.
L’usage de cet attribut est directement lié à l’usage des fonctionsRoom.schemaLocation
(APT et KAPT) etRoom.schemaDirectory
(KSP). En effet, si la valeur de l’attributexportSchema
est true
, le schéma de la base de données sera exporté dans le dossier spécifié par ces fonctions.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Liez vos convertisseurs de type à la base de données
À ce stade, Room connaît les entités et les DAOs à manipuler. Mais il lui manque encore une information essentielle : la liste des convertisseurs de type.
Pour lier vos convertisseurs de type à la base de données Room, vous pouvez utiliser une nouvelle annotation :@TypeConverters
. Cette annotation, à l’image de l’annotation@Database
doit être portée par la classe abstraite qui fait office de conteneur de la base de données. Elle accepte en tant que valeur la liste des classes utilisées en tant que convertisseurs de type.
Dans le cadre de l’application PETiSoin une unique classe est utilisée en tant que convertisseur de type :Converters
.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Voici une vidéo qui récapitule les principales étapes pour configurer votre base de données.
À vous de jouer !
Contexte
Dans le projet, disponible sur GitHub (Java ou Kotlin), la classe conteneur de la base de données a déjà été créée mais ce n’est pas suffisant pour permettre le bon fonctionnement de la rubrique “Santé” de l’application.
Consignes
Dans le package
com.openclassRooms.Room.data.database
, référencez l’entitéVaccine
et le DAOVaccineDao
au sein de la classePETiSoinDatabase
.Dans cette même classe, référencez votre convertisseur de type nécessaire au bon fonctionnement global de la base de données.
N’oubliez pas d'incrémenter le numéro de version de la base de données !
Livrables
Vous pouvez dupliquer le projet GitHub pour modifier le code source du projet et fournir un projet qui compile.
En résumé
Pour lier les DAOs à la base de données, il convient de créer une classe abstraite dite “conteneur”.
L’annotation
@Database
permet de lier les entités à la base de données, de définir son numéro de version et de préciser si son schéma doit être exporté ou non.L’annotation
@TypeConverters
permet de lier les convertisseurs de types à la base de données.
Vous avez défini la classe conteneur de la base de données, mais vous n’avez pas encore créé d’instance de celle-ci. C’est ce que nous allons voir dans le chapitre suivant !