使用Room Auto-Migration如何实现多列删除或重命名操作
注意:Room Auto Migration 处于 Beta 阶段 - 2.4.0-beta02
你遇到的报错是因为2.4.0-beta02版本的Room中,@DeleteColumn、@RenameColumn这类迁移注解还未适配Kotlin的重复注解规则,而Kotlin本身对非SOURCE保留级别的重复注解支持有限,所以无法直接在同一个AutoMigrationSpec类上添加多个相同注解。
你可以选择以下两种方案解决问题:
方案一:升级Room版本
2.4.0及以上的稳定版Room已经修复了该问题,官方对迁移注解做了重复注解适配,你现有的代码不需要做任何修改,直接升级Room依赖版本即可正常编译运行。
方案二:使用手动Migration实现
如果当前项目暂时无法升级Room版本,可以用手动迁移替代自动迁移,实现步骤如下:
- 移除Database注解中的自动迁移配置,确认新旧数据库版本号
- 实现自定义Migration类,编写对应的SQL语句完成字段、表的修改操作,示例代码如下:
// 替换下方的[旧版本号]、[新版本号]为你项目对应的实际数据库版本 val MIGRATION_OLD_TO_NEW = object : Migration(旧版本号, 新版本号) { override fun migrate(database: SupportSQLiteDatabase) { // 删除User表的phone字段 database.execSQL("ALTER TABLE `User` DROP COLUMN `phone`") // 删除Product表的description字段 database.execSQL("ALTER TABLE `Product` DROP COLUMN `description`") // 删除Category表 database.execSQL("DROP TABLE IF EXISTS `Category`") } }
- 在数据库初始化时添加该迁移规则:
Room.databaseBuilder( context.applicationContext, 你的Database类::class.java, "你的数据库名称" ) .addMigrations(MIGRATION_OLD_TO_NEW) .build()
如果需要实现重命名字列的需求,Android 11以下自带的SQLite版本不支持ALTER TABLE RENAME COLUMN语法,可以通过「创建符合新结构的临时表→复制旧表数据到临时表→删除旧表→将临时表重命名为原表名」的流程完成操作。
内容的提问来源于stack exchange,提问作者clamentjohn
相关产品推荐
相关产品推荐

