Android房间迁移添加枚举列表
Posted
技术标签:
【中文标题】Android房间迁移添加枚举列表【英文标题】:Android room migration add a list of enums 【发布时间】:2019-08-16 14:33:08 【问题描述】:我在省钱
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...
错误。
我被困住了。所以请帮忙!如何使迁移工作?
【问题讨论】:
【参考方案1】:原来是我缺乏 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
)
将旧值移入新值。请注意,我们将 bar 默认设置为空数组。
删除原始 (settings
) 表
将临时名称重命名为旧名称(即settings_new
--> settings
)
【讨论】:
【参考方案2】:尝试更改设置表名称设置,您只通过设置..
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
【讨论】:
谢谢,但这是一回事。 Room 明白是Settings
我要修改,如报错信息所示。以上是关于Android房间迁移添加枚举列表的主要内容,如果未能解决你的问题,请参考以下文章