新增表并升级版本号后Room数据库执行首次操作时卡住如何解决
问题根因
核心错误是3→4版本升级的建表语句字段属性和实体类定义不匹配,Room完成升级操作后会校验实际表结构是否和实体定义的Schema一致,匹配失败就会触发卡死、冻结现象。
具体不匹配的点:
PaymentOptionsEntity中主键id定义为非空String类型- 升级语句中把
id字段定义为INTEGER整型,且缺少非空约束
修复方案
修改MIGRATION_3_4的建表语句,字段类型改成SQLite对应的字符串类型TEXT,同时补充NOT NULL约束:
val MIGRATION_3_4 = object : Migration(3, 4){ override fun migrate(database: SupportSQLiteDatabase) { database.execSQL("CREATE TABLE IF NOT EXISTS `PaymentOptionsEntity` (`id` TEXT NOT NULL, PRIMARY KEY(`id`))") } }
注意事项
如果测试设备上已经运行过错误的升级逻辑,需要先卸载应用/清除应用数据,避免残留的错误表结构导致校验依旧失败。后续写升级语句时可以直接从Room自动生成的schema json文件中复制对应表的建表语句,避免手写出错。
内容的提问来源于stack exchange,提问作者Jim Clermonts
相关产品推荐
相关产品推荐

