Номер дійсно НЕ є добре Міграційна система, по крайней мере, до2.1.0-alpha03 .
Отже, поки ми не вдосконалимо систему міграції, є кілька обхідних шляхів для легкої міграції в кімнаті.
Оскільки не існує такого методу як @Database(createNewTables = true) або MigrationSystem.createTable(User::class), який мав би бути тим чи іншим, єдиним можливим способом є запуск
CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))
всередині вашого migrateметоду.
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))")
}
}
Для того, щоб перейти вище сценарію SQL , у вас є 4 способи
1. Пишіть самі
В основному, вам потрібно написати вищезазначений сценарій, який буде відповідати сценарію, який генерує Room. Цей шлях можливий, а не здійсненний. (Припустимо, у вас є 50 полів)
2. Схема експорту
Якщо ви включите exportSchema = trueвсередину @Databaseанотації, Room згенерує схему бази даних в межах / схем папки вашого проекту. Використання є
@Database(entities = [User::class], version = 2, exportSchema = true)
abstract class AppDatabase : RoomDatabase {
//...
}
Переконайтеся, що ви включили рядки нижче в build.gradeмодулі програми
kapt {
arguments {
arg("room.schemaLocation", "$projectDir/schemas".toString())
}
}
Під час запуску або побудови проекту ви отримаєте файл JSON 2.json, який містить усі запити у вашій базі даних Room.
"formatVersion": 1,
"database": {
"version": 2,
"identityHash": "325bd539353db508c5248423a1c88c03",
"entities": [
{
"tableName": "User",
"createSql": "CREATE TABLE IF NOT EXISTS `${TABLE_NAME}` (`id` INTEGER NOT NULL, PRIMARY KEY(`id`))",
"fields": [
{
"fieldPath": "id",
"columnName": "id",
"affinity": "INTEGER",
"notNull": true
},
Отже, ви можете включити вищезазначене createSqlу свій migrateметод.
3. Отримайте запит від AppDatabase_Impl
Якщо ви не хочете експортувати схему, ви все одно можете отримати запит, запустивши або побудувавши проект, який створить AppDatabase_Impl.javaфайл. і в межах вказаного файлу, який ви можете мати.
@Override
public void createAllTables(SupportSQLiteDatabase _db) {
_db.execSQL("CREATE TABLE IF NOT EXISTS `User` (`id` INTEGER, PRIMARY KEY(`id`))");
У межах createAllTablesметоду будуть створені сценарії створення всіх сутностей. Ви можете отримати його і включити в себе migrateметод.
4. Обробка анотацій.
Як можна здогадатися, Room генерує все вищезазначене schemaта AppDatabase_Implфайли протягом часу компіляції та за допомогою обробки анотацій, яку ви додаєте за допомогою
kapt "androidx.room:room-compiler:$room_version"
Це означає, що ви також можете зробити те саме і створити власну бібліотеку обробки анотацій, яка генерує всі необхідні запити створення для вас.
Ідея полягає в тому, щоб створити бібліотеку обробки анотацій для приміток приміщення @Entityта @Database. Візьмемо, наприклад, клас, до якого додано примітки @Entity. Ось такі кроки вам доведеться виконати
- Створіть нову
StringBuilderта додайте "СТВОРИТИ ТАБЛИЦЮ, ЯКЩО НЕ ІСНУЄ"
- Отримати ім'я таблиці або з
class.simplenameабо tableNameобласті @Entity. Додайте його до свогоStringBuilder
- Потім для кожного поля вашого класу створіть стовпці SQL. Візьміть назву, тип, дозвіл поля на поле або самим полем, або
@ColumnInfoанотацією. Для кожного поля потрібно додати id INTEGER NOT NULLстиль стовпця до вашого StringBuilder.
- Додайте первинні ключі за допомогою
@PrimaryKey
- Додайте
ForeignKeyта Indicesякщо існує.
- Після закінчення перетворіть його на рядок і збережіть у якомусь новому класі, який ви хочете використовувати. Наприклад, збережіть його, як показано нижче
public final class UserSqlUtils {
public String createTable = "CREATE TABLE IF NOT EXISTS User (id INTEGER, PRIMARY KEY(id))";
}
Потім ви можете використовувати його як
val MIGRATION_1_2 = object : Migration(1, 2){
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL(UserSqlUtils().createTable)
}
}
Я зробив для себе таку бібліотеку, яку ви можете перевірити і навіть використовувати у своєму проекті. Зверніть увагу, що створена мною бібліотека не повна, і вона просто відповідає моїм вимогам до створення таблиць.
Розширення кімнати для кращої міграції
Додаток, що використовує RoomExtension
Сподіваюся, це було корисно.
ОНОВЛЕННЯ
На момент написання цієї відповіді була версія кімнати, 2.1.0-alpha03і коли я надіслав електронною поштою розробникам, отримав відповідь
Очікується, що в Україні буде покращена система міграції 2.2.0
На жаль, нам все ще бракує кращої системи міграції.