Android комната миграции добавить список перечислений - PullRequest
4 голосов
/ 26 марта 2019

Я сохраняю

data class Settings(
    val foo: Int
)

в базе данных своей комнаты версии 1.

Теперь мне нужно расширить Settings до

data class Settings(
    val foo: Int,
    val bar: ArrayList<Baz>
)

, где

enum class Baz {
    A, B, C
}

, поэтому мне нужно выполнить переход на версию 2.

У меня есть преобразователи типов для bar.В настоящее время я пытаюсь что-то вроде

val MIGRATION_1_2: Migration = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("ALTER TABLE settings ADD COLUMN bar TEXT")
    }
}

, но это дает мне ошибку IllegalStateException: Migration didn't properly handle Settings....

И я застрял.Поэтому, пожалуйста, помогите!Как заставить эту миграцию работать ??

Ответы [ 2 ]

0 голосов
/ 27 марта 2019

Оказывается, это был мой недостаток навыков SQLite.

Прежде всего, мне нужно было установить значение по умолчанию, поскольку моему bar не было разрешено быть null. Во-вторых, ALTER TABLE безумно ограничен и не позволяет мне устанавливать значение по умолчанию в одной строке.

Я закончил делать

val MIGRATION_1_2: Migration = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("CREATE TABLE settings_new (foo INTEGER NOT NULL, bar TEXT NOT NULL, PRIMARY KEY(foo))")
        database.execSQL("INSERT INTO settings_new (foo, bar) SELECT foo, '[]' AS bar FROM settings")
        database.execSQL("DROP TABLE settings")
        database.execSQL("ALTER TABLE settings_new RENAME TO settings")
    }
}

Другими словами

  1. Создать новую временную таблицу (settings_new)
  2. Переместить старые значения в новые. Обратите внимание, что мы устанавливаем bar как пустой массив по умолчанию.
  3. Отбросьте оригинальный (settings) стол
  4. Переименуйте временное в старое имя (т.е. settings_new -> settings)
0 голосов
/ 26 марта 2019

Попробуйте изменить имя таблицы настроек. Настройки и вы передадите только настройку ..

    database.execSQL("ALTER TABLE Settings ADD COLUMN bar TEXT")

после добавления ..

database =  Room.databaseBuilder(context.getApplicationContext(),
    UsersDatabase.class, "Sample.db")
    .addMigrations(MIGRATION_1_2)
    .build();

см. Это .. Перенос базы данных комнаты, еслидобавлена ​​только новая таблица

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...