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

Room数据库版本升级报错求助:完整性验证失败与迁移缺失

Room数据库版本升级报错的解决方法

你遇到的问题本质是:修改了数据库Schema(比如实体类增删字段、调整表结构)后,升级了数据库版本但未提供对应的迁移逻辑,Room无法自动完成旧版本数据到新版本的转换,因此抛出迁移缺失的错误。以下是两种可行的解决方式:

方法一:允许破坏性迁移(快速处理)

如果处于开发测试阶段,或者数据库中的数据可以丢失,直接让Room删除旧数据库并重建新版本是最快捷的方案。只需在构建RoomDatabase时添加fallbackToDestructiveMigration()方法:

Kotlin示例

val db = Room.databaseBuilder(
    context.applicationContext,
    AppDatabase::class.java, "app_database"
)
    .fallbackToDestructiveMigration()
    .build()

Java示例

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "app_database")
        .fallbackToDestructiveMigration()
        .build();

方法二:自定义Migration(保留现有数据)

如果需要保留用户的现有数据,必须编写自定义迁移逻辑,告诉Room如何将旧版本的数据库结构转换为新版本。

步骤1:创建Migration对象

根据你对Schema的修改,编写对应的SQL语句。比如如果是给user表新增age字段,代码如下:

Kotlin示例

val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        // 执行SQL修改表结构
        database.execSQL("ALTER TABLE user ADD COLUMN age INTEGER DEFAULT 0")
    }
}

Java示例

static final Migration MIGRATION_1_2 = new Migration(1, 2) {
    @Override
    public void migrate(SupportSQLiteDatabase database) {
        database.execSQL("ALTER TABLE user ADD COLUMN age INTEGER DEFAULT 0");
    }
};

步骤2:将Migration添加到数据库构建器

在创建RoomDatabase实例时,通过addMigrations()方法传入自定义的迁移对象:

Kotlin示例

val db = Room.databaseBuilder(
    context.applicationContext,
    AppDatabase::class.java, "app_database"
)
    .addMigrations(MIGRATION_1_2)
    .build()

Java示例

AppDatabase db = Room.databaseBuilder(getApplicationContext(),
        AppDatabase.class, "app_database")
        .addMigrations(MIGRATION_1_2)
        .build();

注意事项

  • 迁移的SQL语句必须严格匹配Schema的变化,比如修改表名、删除字段、创建新表等操作都需要对应编写SQL;
  • 如果存在多版本升级(比如从1→2→3),需要为每一个版本区间创建对应的Migration对象,并全部添加到构建器中。

内容的提问来源于stack exchange,提问作者Josef M

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.08.18 07:45:38