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
相关产品推荐
相关产品推荐

