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 publique 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.java
public class WordRepository {

 private final WordDao mWordDao;
 private final LiveData<List<Word>> mAllWords;

 public WordRepository(Application application) {
     WordRoomDatabase db = WordRoomDatabase.getDatabase(application);
     mWordDao = db.wordDao();
     mAllWords = mWordDao.getAlphabetizedWords();
 }

 // 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é.
 public LiveData<List<Word>> getAllWords() {
     return mAllWords;
 }

 // Vous devez appeler cela sur un thread non-UI ou votre application lancera une exception.
 // Room garantit que vous n'effectuez aucune opération longue sur le thread principal, bloquant l'interface utilisateur.
    public void insert(Word word) {
        WordRoomDatabase.databaseWriteExecutor.execute(() -> mWordDao.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 méthodes 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 méthode getAllWords renvoie la liste LiveData de mots de Room. Nous pouvons le faire en raison de la manière dont nous avons défini la méthode 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, nous utilisons donc l'ExecutorService que nous avons créé dans WordRoomDatabase pour effectuer 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.