Course Content
-
Сохраняем данные в Room + ViewModel
- Коротко об Android Architecture Components и Room
- Создание проекта и добавление необходимых зависимостей
- Создание Entity
- Создание DAO
- Знакомство с LiveData
- Создание базы данных Room
- Знакомство с патерном Repository (Репозиторий) и создание слоя для доступа к данным
- Создание ViewModel
- Создание ячейки списка для отображения UI
- Создание адаптера и добавление RecyclerView
- Добавление записи в БД используя Room
- Создание Activity
- Подключение к базе данных Room
- Итоги
Знакомство с патерном 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) } }
Давайте пройдёмся по основным моментам:
- Вместо экземпляра базы данных мы передаём только DAO в репозиторий. Это нужно потому что нам необходим доступ только к данным из таблицы Word, а DAO имеет все методы для получения и обновления данных.
- Список слов
val allWords
является публичным свойством и имеет типLiveData<List<Word>>
. Теперь когда данные изменятся то LiveData оповестит об этом. - Модификатор
suspend
используется для использования корутин
В следующем уроке мы рассмотрим создание ViewModel
для отображения данных в UI и корректной работы при пересоздании Activity/Fragment