fbpx

Знакомство с патерном Repository (Репозиторий) и создание слоя для доступа к данным

Что такое репозиторий?

Репозиторий не является частью Android Architecture Components или частью Android. Это абстракция скрывающая реализацию доступа к источнику данных. Такой способ является полезным и очень популярным, потому что в этом случае вы жестко не завязаны на какую-то конкретную реализацию источника данных. С помощью репозитория ваш клиентский код (например код из Activity или Fragment) не знает к какому источнику данных он обращается. Например, вам нужно получить список слов. Вы можете получить данные из сети, из файла или из локальной базы данных. Но, если вы не используете паттерн репозиторий, то каждый раз, когда у вас меняется источник данных, вам необходимо переписывать и менять код в вашем Activity или Fragment’e. Используя же абстракцию в виде репозитория вы обращаетесь только к классу, который реализует интерфейс репозитория и детали скрыты. Таким образом ваш код устойчив к изменениям, является более гибким и соответствует принципу single responsibility.

Схематичное изображение репозитория

Когда использовать?

В мобильной разработке репозиторий часто используется для смены источника данных: либо для получения данных из сети, или получение уже закешированных данных из локальной базы данных.

Создание репозитория для доступа к данным

Для создания класса репозитория создайте класс WordRepository  как показано ниже

// Объявляем DAO как private свойство в конструкторе. Передаем DAO
// вместо всей базы данных, потому что нам необходим доступ только к данному объекту
class WordRepository(private val wordDao: WordDao) {

    // Room выполняет все запросы в отдельном потоке.
    // Когда данные изменятся LiveData оповестит подписчиков.
    val allWords: LiveData<List<Word>> = wordDao.getAlphabetizedWords()
 
    suspend fun insert(word: Word) {
        wordDao.insert(word)
    }
}

Давайте пройдёмся по основным моментам:

  1. Вместо экземпляра базы данных мы передаём только DAO в репозиторий. Это нужно потому что нам необходим доступ только к данным из таблицы Word, а DAO имеет все методы для получения и обновления данных.
  2. Список слов val allWords является публичным свойством и имеет тип LiveData<List<Word>> . Теперь когда данные изменятся то LiveData оповестит об этом.
  3. Модификатор suspend используется для использования корутин

В следующем уроке мы рассмотрим создание  ViewModel для отображения данных в  UI и корректной работы при пересоздании Activity/Fragment