Aller au contenu

Créer la classe Repository

6.1 Qu'est-ce qu'une classe Repository ?

Une classe Repository est une abstraction qui permet d'accéder à plusieurs sources de données. La classe Repository ne fait pas partie des bibliothèques Architecture Components, mais elle est suggérée comme bonne pratique pour la séparation du code et l'architecture. Une classe Repository fournit une API propre pour l'accès aux données au reste de l'application.

Repository diagram

6.2 Pourquoi utiliser une classe Repository ?

Un référentiel (Repository) gère les requêtes et vous permet d'utiliser plusieurs bases de données. Dans l'exemple le plus courant, le référentiel implémente la logique permettant de décider s'il faut récupérer les données d'un réseau ou utiliser les résultats mis en cache dans une base de données locale.

6.3 Implémenter la classe Repository

  1. Créez une classe Kotlin appelée WordRepository sous la racine du package de votre application.
  2. Effectuez un clic droit sur la classe WordRepository, puis sélectionnez Refactor > Move pour la déplacer sous le package data.
  3. Ajoutez le code suivant :

    data/WordRepository.kt
    class WordRepository(private val wordDao: WordDao) {
    
        // Room exécute toutes les requêtes sur un thread distinct.
        // Les données LiveData observées avertiront l'observateur lorsque les données auront changé.
        val allWords: LiveData<List<Word>> = wordDao.getAlphabetizedWords()
    
        // Fonction suspend : elle doit être appelée depuis une coroutine.
        // Room garantit que vous n'effectuez aucune opération longue sur le thread principal, bloquant l'interface utilisateur.
        suspend fun insert(word: Word) {
            wordDao.insert(word)
        }
    }
    

Explications :

  • Le DAO est passé au constructeur du dépôt au lieu de l'ensemble de la base de données. En effet, vous n'avez besoin d'accéder qu'au DAO, car il contient toutes les fonctions de lecture et d'écriture pour la base de données. Il n'est pas nécessaire d'exposer l'ensemble de la base de données au dépôt.
  • La propriété allWords expose la liste LiveData de mots de Room. Nous pouvons le faire en raison de la manière dont nous avons défini la fonction getAlphabetizedWords pour renvoyer LiveData à l'étape "Utiliser la classe LiveData". Room exécute toutes les requêtes sur un thread séparé. Ensuite, LiveData observé avertira l'observateur sur le thread principal lorsque les données auront changé.
  • Nous devons éviter d'exécuter l'insertion sur le thread principal : la fonction insert est donc déclarée avec suspend. Elle sera appelée depuis une coroutine (voir la tâche suivante), et Room effectuera l'insertion sur un thread d'arrière-plan.

Rôle du Repository

Les référentiels sont destinés à servir d'intermédiaire entre différentes sources de données. Dans cet exemple simple, vous n'avez qu'une seule source de données, donc le référentiel ne fait pas grand-chose. Consultez l'exemple de base pour une implémentation plus complexe.