Course Content
-
Сохраняем данные в Room + ViewModel
- Коротко об Android Architecture Components и Room
- Создание проекта и добавление необходимых зависимостей
- Создание Entity
- Создание DAO
- Знакомство с LiveData
- Создание базы данных Room
- Знакомство с патерном Repository (Репозиторий) и создание слоя для доступа к данным
- Создание ViewModel
- Создание ячейки списка для отображения UI
- Создание адаптера и добавление RecyclerView
- Добавление записи в БД используя Room
- Создание Activity
- Подключение к базе данных Room
- Итоги
Создание базы данных Room
Знакомство с базой данных Room
- Room – высокоуровневый интерфейс для доступа к базе данных SQLite.
- Room позволяет легко работать с данными, до этого использовался
SQLiteOpenHelper
- Room использует DAO для выполнения запросов к базе данных.
- По умолчанию, для большей производительности и оптимизации UI, Room не позволяет выполнять запросы в главном потоке. Все запросы работают асинхронно в фоновом потоке.
- Во время компиляции Room проверяет SQL выражения и сразу предупреждает об ошибках в запросе.
Создание базы данных Room
Чтобы создать класс базы данных, необходимо создать абстрактный класс, который наследуется от RoomDatabase
Обычно достаточно одного экземпляра базы данных для всего приложения, поэтому используется паттерн Singleton. Создадите класс БД как показано ниже:
// Annotates class to be a Room Database with a table (entity) of the Word class @Database(entities = arrayOf(Word::class), version = 1, exportSchema = false) public abstract class WordRoomDatabase : RoomDatabase() { abstract fun wordDao(): WordDao companion object { // Используется паттерн синглтон для одного экземпляра класса базы данных @Volatile private var INSTANCE: WordRoomDatabase? = null fun getDatabase(context: Context): WordRoomDatabase { val tempInstance = INSTANCE if (tempInstance != null) { return tempInstance } synchronized(this) { val instance = Room.databaseBuilder( context.applicationContext, WordRoomDatabase::class.java, "word_database" ).build() INSTANCE = instance return instance } } } }
Давайте разберём, что здесь написано
- Класс базы данных Room должен быть
abstract
и наследоваться отRoomDatabase
- С помощью аннотации
@Database
данный класс помечен как класс базы данных Room. Кроме этой аннотации нужно добавить список сущностей (таблиц) которые должны быть в этой БД. Также не забудьте указать версию базы данных с помощью version = 1. Для простоты мы не станем рассматривать миграции базы данных, поэтому параметрexportSchema
выставлен вfalse
. В продакшн версии приложения вы должны учесть этот параметр, чтобы иметь возможность экспортировать схему базы данных. - Чтобы получить доступ к DAO нужно создать абстрактное свойство с типом возвращаемого объекта, в данном пример
WordDao
- Чтобы избежать создания нескольких экземпляров
WordRoomDatabase
нужно использовать паттерн singleton используяcompanion object
getDatabase
возвращает синглтон. Во время первого обращения будет создана БД Room, используя с названием"word_database"
.
Обратите внимание, если вы меняете схему базы данных (например добавляете новые поля, меняете тип данных) то необходимо поднимать версию и реализовать стратегию миграции для клиентов со старой версией базы данных. Для этого примера мы выбрали стратегию удаления и пересоздания базы данных. Минус такого подхода в том, что все данные будут потеряны при обновлении версии. Для более подробного описания как реализовать миграцию можно ознакомиться с этой статьей
В следующем уроке мы рассмотрим паттерн репозиторий и создадим слой для доступа к данным, который не будет зависеть от конкретной реализации источника данных.