Rendre nos objets accessible : les DAO
Objectifs
Rendre nos objets Room accessibles
Créer nos DAO (Data Access Objects) permettant de communiquer avec nos objets
Créer des repository qui feront la transition entre la couche domaine et la couche data
Contexte :
Maintenant que nos objets sont créés il nous faut les rendre accessibles. Dans la librairie Room nos objets entités sont rendus accessibles par des DAO (Data Access Objects). Ce sont des classes qui permettent d'accéder à nos données grâce à des requêtes SQL de la même manière que sur une base de données embarquée traditionnelle comme SQLlite.
Fondamental :
Une fois nos DAO créés nous y accédons grâce à des classes repository qui ont pour seul but de faire la liaison en lecture et écriture avec le reste de notre application.
Nous avons un DAO et un repository par entité pour respecter la séparation des préoccupations.
Les DAO et les repository sont dans la couche data de notre architecture car ces classes ont pour seul rôle d'interagir avec des données et n'ont aucun lien ou dépendance avec la logique de notre application.
Nous pourrions si besoin copier la couche data dans un autre projet sans avoir à modifier quoi que ce soit.
DAO question :
L'annotation @Dao
permet d'indiquer à Room que cette classe est utilisée pour accéder à une entité.
Les fonctions de notre DAO sont présentées avec la query SQL précédée de l'annotation @Query
suivie d'une simple définition de la fonction Kotlin qui lui est associée.
Room propose des annotations telles que @Insert
pour simplifier et éviter d'écrire la requête SQL d'insertion.
Room nous permet de renvoyer directement des Flow à la sortie de notre DAO, ce qui nous permet de traiter les données de notre base de données Room comme des Flow classiques et donc d'actualiser, par exemple, notre liste de questions automatiquement si des éléments sont ajoutés en base de données.
QuestionRepository :
Notre repository fait appel au DAO et reprend simplement les fonctions dont nous aurons besoin.