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

Room数据库新增表后无法插入数据,报数据完整性验证错误

解决Room数据库数据完整性验证失败问题

1. 先检查数据库版本号

新增表后必须提升数据库版本号,Room靠版本号识别结构变更。
比如原来的数据库注解:

@Database(entities = [UserSong::class], version = 1)
abstract class AppDatabase : RoomDatabase() { ... }

新增表后要改成:

@Database(entities = [UserSong::class, PlaylistSong::class], version = 2)
abstract class AppDatabase : RoomDatabase() { ... }

2. 处理数据库迁移

Room不会自动适配表结构变更,得选下面两种方式之一:

方式一:写迁移规则(生产环境用)

创建Migration类定义版本1到2的变更逻辑,比如新增表的SQL:

val MIGRATION_1_2 = object : Migration(1, 2) {
    override fun migrate(database: SupportSQLiteDatabase) {
        database.execSQL("""
            CREATE TABLE PlaylistSong (
                id INTEGER PRIMARY KEY AUTOINCREMENT,
                songId INTEGER,
                playlistId INTEGER,
                title TEXT,
                artist TEXT
                -- 按你的实体类字段补全
            )
        """.trimIndent())
    }
}

然后构建数据库时添加迁移:

Room.databaseBuilder(context, AppDatabase::class.java, "music_db")
    .addMigrations(MIGRATION_1_2)
    .build()

方式二:允许破坏性重建(仅开发测试用)

开发阶段不想写迁移的话,让Room删除旧库重建(会丢数据):

Room.databaseBuilder(context, AppDatabase::class.java, "music_db")
    .fallbackToDestructiveMigration()
    .build()

3. 核对实体类与表结构

确保新增的PlaylistSong实体注解正确,比如:

@Entity(tableName = "PlaylistSong")
data class PlaylistSong(
    @PrimaryKey(autoGenerate = true) val id: Int = 0,
    val songId: Int,
    val playlistId: Int,
    val title: String,
    val artist: String
)

检查字段类型、主键、表名和迁移SQL里的定义完全一致,别写错拼写。

4. 清除旧应用数据(开发阶段)

如果之前装过旧版本,残留的旧数据库可能导致验证失败,直接去设备应用设置里清数据,再重新运行。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.19 06:59:50