使用Room 2.4.0-alpha01自动迁移新增列出现运行时错误怎么处理
从报错日志对比可以看到,你期望的表结构新增了nameOfNextOfKin、phoneOfNextOfKin两个字段,但实际数据库表中没有这两个字段,自动迁移未生效,按以下步骤排查解决即可:
第一步:检查build.gradle的schema导出配置
仅在Database注解中加exportSchema = true不够,需要在模块级build.gradle中配置schema文件的输出路径,Room需要读取历史schema文件生成自动迁移逻辑:android { ... defaultConfig { ... javaCompileOptions { annotationProcessorOptions { // 配置Room schema文件的输出目录 arguments["room.schemaLocation"] = "$projectDir/schemas".toString() } } } }第二步:检查新增字段的注解配置
你新增的两个字段如果是不可空类型,必须在@ColumnInfo中指定默认值,否则自动迁移无法执行:// 可空String字段,不需要指定默认值 @ColumnInfo(name = "nameOfNextOfKin") private String nameOfNextOfKin; // 非空基本类型字段必须指定默认值 @ColumnInfo(name = "xxx", defaultValue = "0") private int xxx;第三步:清理构建缓存重新编译
执行Build -> Clean Project,再执行Rebuild Project,确保项目根目录的schemas文件夹下同时存在1.json(版本1的schema)和2.json(版本2的schema)两个文件。第四步:验证迁移逻辑
测试时先安装版本1的APK写入测试数据,再安装版本2的APK,不会再抛出结构不匹配的错误。
如果以上步骤完成后还是无法走自动迁移,可以临时用手动迁移方案兜底:
// 定义版本1到2的手动迁移规则 static final Migration MIGRATION_1_2 = new Migration(1, 2) { @Override public void migrate(SupportSQLiteDatabase database) { database.execSQL("ALTER TABLE accounts ADD COLUMN nameOfNextOfKin TEXT"); database.execSQL("ALTER TABLE accounts ADD COLUMN phoneOfNextOfKin TEXT"); } }; // 数据库构建时添加迁移规则 Room.databaseBuilder(context.getApplicationContext(), AppDatabase.class, "database-name") .addMigrations(MIGRATION_1_2) .build();
内容的提问来源于stack exchange,提问作者Ziyaad Shiraz
相关产品推荐
相关产品推荐

