【发布时间】:2021-10-25 04:12:21
【问题描述】:
我在 stackoverflow 上搜索了一个类似的问题,但没有找到,针对不同情况的其他可能的解决方案也对我不起作用。我打开这个问题,发现我找不到解决这个问题的方法,也找不到类似的问题。
我尝试使用 Android Room 的自动迁移功能,但始终无法正常工作。
目前的情况如下:
我有一个数据库版本 1
我想在一个表中添加一个新列,这是我想做的唯一修改。此列将保存 String 值,仅此而已。
此新列仅存在于数据库版本 2 中
我已经按照 Android 文档设置了数据库
当我再次运行应用程序(数据库版本 1 填充数据的应用程序)时,应用程序崩溃
控制台中的崩溃错误是这样的:
2021-08-24 21:35:53.941 3081-3141/com.app.test E/AndroidRuntime: FATAL EXCEPTION: pool-18-thread-2
Process: com.app.test, PID: 3081
java.lang.IllegalStateException: Migration didn't properly handle: My(com.com.app.test.data.datbase.entity.MyEntity).
Expected:
TableInfo{name='My', columns=long list of column definitions}
Found:
2021-08-24 21:35:53.942 3081-3141/com.app.test E/AndroidRuntime: TableInfo{name='My', columns=long list of column definitions, plus the new one}
我已经使用新版本号 (2) 设置了数据库,并将导出模式设置为 true,并定义了从 1 到 2 的自动迁移。
我还在 app gradle 配置选项中定义了 schemaLocation。
我找不到任何解释为什么这不起作用,这是向现有表添加新列的简单操作。
有谁知道为什么这不起作用,我怎样才能让它工作而无需手动编写迁移?
编辑:仔细检查后,数据库迁移中的 defaultValue 定义似乎存在一些问题。
预期显示列的默认值不为空,这是正确的
defaultValue=''NOT_NOTIFIED''
发现显示为空,这是不正确的
defaultValue='NULL'
该实体的列定义如下
@ColumnInfo(name = "notified", defaultValue = "NOT_NOTIFIED")
public String notified = "NOT_NOTIFIED";
但不知何故,它正在生成默认值为 null 的定义或迁移,而不是我设置的值。
【问题讨论】:
标签: android android-room database-migration