You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.01 01:48:03