fbpx

Создание базы данных 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
            }
        }
   }
}

Давайте разберём, что здесь написано

  1. Класс базы данных Room должен быть abstract и наследоваться от RoomDatabase
  2. С помощью аннотации @Database данный класс помечен как класс базы данных Room. Кроме этой аннотации нужно добавить список сущностей (таблиц) которые должны быть в этой БД. Также не забудьте указать версию базы данных с помощью version = 1.  Для простоты мы не станем рассматривать миграции базы данных, поэтому параметр  exportSchema выставлен в false. В продакшн версии приложения вы должны учесть этот параметр, чтобы иметь возможность экспортировать схему базы данных.
  3. Чтобы получить доступ к DAO нужно создать абстрактное свойство с типом возвращаемого объекта, в данном пример WordDao
  4. Чтобы избежать создания нескольких экземпляров WordRoomDatabase нужно использовать паттерн singleton используя companion object
  5. getDatabase возвращает синглтон. Во время первого обращения будет создана БД Room, используя с названием "word_database".

Обратите внимание, если вы меняете схему базы данных (например добавляете новые поля, меняете тип данных) то необходимо поднимать версию и реализовать стратегию миграции для клиентов со старой версией базы данных. Для этого примера мы выбрали стратегию  удаления и пересоздания базы данных. Минус такого подхода в том, что все данные будут потеряны при обновлении версии. Для более подробного описания как реализовать миграцию можно ознакомиться с этой статьей

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