Номер дійсно НЕ є добре Міграційна система, по крайней мере, до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
На жаль, нам все ще бракує кращої системи міграції.