Tout est en place pour finaliser l’utilisation de la base de données ! Il est donc temps de créer une instance de la base de données en y appliquant les éléments de configuration décidés précédemment.
Créez une instance de la base de données
Pour créer une instance de la base de données tout en y appliquant la configuration souhaitée, Room utilise le patron de conception Builder.
Pour démarrer l’utilisation du patron de conception Builder,
utilisez la méthode statique
Room.databaseBuilder()
qui accepte trois paramètres :un
Context
;la classe conteneur de la base de données ;
le nom du fichier db dans lequel persister la base de données.
Puisqu’il s’agit du patron de conception Builder, appelez la méthode
build()
pour obtenir l’instance de la base de données.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Appliquez la configuration
C’est bon, nous avons une instance de la base de données. Cependant, la configuration définie plus tôt n’a été appliquée qu’en partie. En effet, uniquement la partie liée au stockage a été considérée. Les prochaines lignes seront donc consacrées à l’application du reste de la configuration.
Gérez le threading
Pour la gestion du threading, bonne nouvelle nous n’avons rien à faire. En effet, comme expliqué précédemment, par défaut, Room garantit que l’accès à la base de données ne se fasse jamais à partir du thread principal. Ça permet d’utiliser un thread adapté pour les opérations I/O (in/out).
Gérez la migration du schéma de la base de données
Puisqu’il s’agit de la toute première version de la base de données, il n’est pas nécessaire de gérer des migrations. Cependant, Room offre plusieurs solutions pour gérer les migrations du schéma de votre base de données.
Par défaut, Room va tenter de gérer lui-même la migration du schéma de votre base de données. Si les modifications sont simples, Room devrait s’en sortir. Dans le cas contraire, une exception sera levée. Deux stratégies peuvent alors être mises en place.
La première stratégie, et peut-être la plus radicale, est de demander à Room de purement et simplement supprimer la base de données pour la recréer. Pour cela, vous pouvez utiliser la méthode
fallbackToDestructiveMigration()
qui détruira la base de données pour la reconstruire.La seconde stratégie est d’aider Room à gérer les migrations entre deux versions du schéma de votre base de données et ainsi éviter de perdre l’ensemble des données qui y seraient stockées. Pour ce faire, vous pouvez utiliser la méthode
addMigrations()
. Pour chacune des migrations proposées à Room, il est nécessaire de préciser une version de départ et une version d'arrivée. Room exécute ces migrations pour mettre à jour la base de données vers la version la plus récente. Chaque migration vous permet de manipuler un objetSupportSQLiteDatabase
vous permettant de manipuler directement la base de données SQLite à travers des requêtes SQL.
Gérez le pré-embarquement des données
Pour pré-embarquer des données, Room offre également plusieurs possibilités.
La première est d’utiliser la méthode
addCallback()
. Cette méthode accepte en paramètre une instance de la classeRoomDatabase.Callback
dont la méthodeonCreate
est automatiquement appelée lors de la création de la base de données. Cette méthode permet de manipuler un objetSupportSQLiteDatabase
offrant alors la possibilité d’écrire des requêtes SQL pour insérer des données par exemple.La seconde option est de créer la base de données sur les bases d’un fichier db. Il est alors possible d’utiliser les méthodes
createFromAsset()
,createFromFile()
oucreateFromInputStream()
.
Limitez le nombre de connexion
Quand on manipule des bases de données, on limite généralement à une seule le nombre de connexions à la base de données. En effet, cela ne sert pas à grand-chose de réinitialiser la connexion à la base de données à chaque fois que l’on souhaite l’utiliser.
Pour limiter le nombre de connexions, il est possible d’utiliser le patron de conception Singleton. Le but de ce patron de conception est de limiter l’instanciation d’une classe à un seul objet. Lorsque le programme a besoin d’instancier une classe qui implémente le patron de conception Singleton, une vérification est faite. Si aucune instance de la classe existe alors elle est créée puis renvoyée pour être utilisée. Cependant, si une instance existe déjà, elle est directement renvoyée pour être utilisée.
L’instance est stockée dans la mémoire vive et vie donc pendant toute la durée de vie de l’application mobile. Elle ne survit cependant pas à son arrêt.
L'implémentation du patron de conception donne cela.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Pour utiliser la base de données, il convient simplement d’utiliser ce Singleton.
Si vous utilisez Java : | Si vous utilisez Kotlin : |
|
|
Voici une vidéo qui récapitule les principales étapes pour finaliser et utiliser correctement votre base de données.
À vous de jouer !
Contexte
C’est l’étape finale de l’implémentation technique de la rubrique “Santé” de l’application PETiSoin !
Dans le projet, disponible sur GitHub (Java ou Kotlin), l'entité Vaccine, le DAO VaccineDao
et le convertisseur de type Converters ont été référencés.
Consignes
Créez une instance de la base de données et limitez le nombre de connexions à une seule. Pour ce faire, mettez en place le patron de conception Singleton pour limiter le nombre d'instances de la base de données à une seule.
Livrables
Vous pouvez dupliquer le projet GitHub pour modifier le code source du projet et fournir un projet qui compile.
En résumé
Il est possible de configurer Room pour indiquer si les opérations sur la base de données peuvent s’effectuer sur le thread principal ou pas.
Room offre la possibilité de pré-peupler la base de données au moment de sa création.
En cas de changement majeur dans le schéma de la base de données entre deux versions, il est de préciser de configurer la politique de migration.
Les bonnes pratiques de développement logiciel recommandent d’implémenter le patron de conception Singleton pour limiter la connexion à la base de données à une unique instance.
Vous avez maintenant une base de données fonctionnelle pour l’application PETiSoin. Nous pouvons à présent rendre son utilisation encore plus robuste en testant la base de données et en utilisant une architecture logicielle moderne et maintenable au sein de l’application.