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房间迁移添加枚举列表的主要内容,如果未能解决你的问题,请参考以下文章

在 Android 中使用房间数据库写入迁移的查询错误

Android房间迁移null错误

带有rxjava的迭代列表Android房间,一一

(Android) 房间数据库迁移不会改变数据库

Android 房间迁移测试失败,但没有任何改变

如何将 Not Null 表列迁移到 Android Room 数据库中的 Null