我要保存
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...
错误。
我被困住了。所以请帮忙!我该如何进行迁移?
答案 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();
答案 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")
}
}
换句话说
settings_new
)settings
)表settings_new
-> settings
)