Библиотека персистентности Room имеет ряд преимуществ по сравнению с прямым использованием API SQLite:
- Проверка запросов SQL во время компиляции
- Удобные аннотации, которые позволяют сократить объем повторяющегося стандартного кода и снизить вероятность ошибок.
- Упрощенные пути переноса баз данных
Если в вашем приложении используется SQLite, но не Room, прочитайте эту страницу, чтобы узнать, как перейти на Room. Если Room – первая реализация SQLite в вашем приложении, ознакомьтесь с основными сведениями об использовании Room для сохранения данных в локальной базе данных.
Этапы переноса
Чтобы перенести реализацию SQLite в Room, выполните следующие действия: Если в вашей реализации SQLite используется большая база данных или сложные запросы, вы можете перейти на Room постепенно. Подробнее о постепенном переносе данных…
Обновление зависимостей
Чтобы использовать Room в приложении, добавьте в файл build.gradle приложения необходимые зависимости. Подробнее о зависимостях переговорных комнат…
Как преобразовать классы моделей в объекты данных
Room использует сущности данных для представления таблиц в базе данных. Каждый класс сущности представляет собой таблицу и имеет свойства, которые представляют столбцы в этой таблице. Чтобы преобразовать существующие классы моделей в объекты Room, выполните следующие действия:
- Добавьте к объявлению класса аннотацию
@Entity, чтобы указать, что это объект Room. Вы можете использовать свойствоtableName, чтобы указать, что результирующая таблица должна иметь имя, отличное от имени класса. - Добавьте аннотацию
@PrimaryKeyк свойству первичного ключа. - Если какому-либо столбцу в полученной таблице нужно присвоить название, отличное от названия соответствующего свойства, добавьте к свойству аннотацию
@ColumnInfoи задайте для свойстваnameправильное название столбца. - Если у класса есть свойства, которые не нужно сохранять в базе данных, добавьте к ним аннотацию
@Ignore, чтобы Room не создавал для них столбцы в соответствующей таблице. - Если у класса несколько конструкторов, укажите, какой из них должен использовать Room, добавив аннотацию
@Ignoreко всем остальным конструкторам.
@Entity(tableName = "users") data class User( @PrimaryKey @ColumnInfo(name = "userid") val id: String, @ColumnInfo(name = "username") val userName: String?, @ColumnInfo(name = "last_update") val date: Date?, )
Создание DAO
Room использует объекты доступа к данным (DAO), чтобы определять функции, которые обращаются к базе данных. Следуйте инструкциям в разделе Как получить доступ к данным с помощью объектов доступа к данным Room, чтобы заменить существующие функции запросов на объекты доступа к данным.
Как создать класс базы данных
В реализациях Room для управления экземпляром базы данных используется класс базы данных. Класс базы данных должен расширять RoomDatabase и ссылаться на все определенные вами объекты и DAO.
@Database(entities = [User::class], version = 2) @ColumnTypeConverters(DateConverter::class) abstract class UsersDatabase : RoomDatabase() { abstract fun userDao(): UserDao }
Как определить путь переноса
Поскольку номер версии базы данных меняется, вам необходимо определить объект Migration, чтобы сохранить существующие данные. Если схема базы данных не меняется, этот перенос может быть пустым.
val MIGRATION_1_2 = object : Migration(1, 2) { override suspend fun migrate(connection: SQLiteConnection) { // Empty implementation, because the schema isn't changing. } }
Подробнее о путях переноса баз данных в Room можно узнать в статье Как перенести базу данных.
Обновите инициализацию базы данных
Определив класс базы данных и путь переноса, вы можете использовать Room.databaseBuilder, чтобы создать экземпляр базы данных с примененным путем переноса:
val db = Room.databaseBuilder<UsersDatabase>(applicationContext, "database-name") .addMigrations(MIGRATION_1_2) .build()
Тестирование реализации
Обязательно протестируйте новую реализацию Room:
- Чтобы протестировать перенос базы данных, следуйте инструкциям в разделе Тестовый перенос.
- Чтобы протестировать функции DAO, следуйте инструкциям в разделе Проверка базы данных.
Постепенный перенос
Если ваше приложение использует большую сложную базу данных, перенести его на Room сразу может быть невозможно. Вместо этого вы можете сначала реализовать объекты данных и базу данных Room, а затем перенести функции запросов в DAO.
Чтобы реализовать поэтапный перенос, получите оболочку совместимости SupportSQLiteDatabase, используя функцию расширения roomDatabase.getSupportWrapper из артефакта androidx.room3:room3-sqlite-wrapper. Этот оболочный код позволяет выполнять прямые SQL-запросы в стиле Android к базе данных, управляемой Room, с помощью API Android SQLite:
// Get SupportSQLiteDatabase wrapper val legacyDb = roomDatabase.getSupportWrapper() legacyDb.execSQL("INSERT INTO users ...")