Android机房迁移添加枚举列表

时间:2019-03-26 09:03:17

标签: android android-room android-architecture-components

我要保存

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 :(得分:0)

尝试更改设置表名称“设置”,然后仅通过设置。

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

添加后。

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

请参阅此.. Room database migration if only new table is added

答案 1 :(得分:0)

原来是我缺乏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