Android Room新增数据表是否需要编写迁移?Room可自动处理吗?
Room新增数据表场景下的迁移规则
新增数据表不是必须手动编写Migration迁移逻辑,高版本Room可以自动完成该场景下的版本适配,但有明确的适用前提。
自动适配的适用场景
- 仅当你使用的Room版本为2.4.0及以上,且本次升级仅做「新增独立数据表」这一项操作,没有涉及原有表的重命名、字段增删改、表删除、数据转换等其他结构变更时,可以完全依赖Room的自动迁移能力,不需要手写SQL逻辑。
- 配置步骤非常简单:
- 将数据库的version号在原有基础上加1
- 把新增表对应的实体类加到
@Database注解的entities数组中 - 在
@Database的autoMigrations参数中声明版本跨度的自动迁移规则,示例代码如下:
// 旧版本version=1,entities只包含原有业务表 @Database( version = 2, entities = [OriginalBizEntity::class, NewTableEntity::class], autoMigrations = [AutoMigration(from = 1, to = 2)] ) abstract class AppDatabase : RoomDatabase() { // 数据库相关业务逻辑 }
配置完成后Room会在APP首次启动升级时,自动根据新实体类的注解信息生成建表SQL执行,原有表内的所有数据都不会被改动。
需要手动编写Migration的场景
- 如果你使用的Room版本低于2.4.0:该版本还未推出自动迁移能力,必须手动实现Migration类,在migrate方法中编写新增表的CREATE TABLE语句,再通过
addMigrations()方法把自定义迁移逻辑加入数据库配置。 - 如果你使用2.4.0及以上版本,但本次升级除了新增表之外,还包含其他Room无法自动推断的结构变更(比如重命名原有表/字段、删除字段、需要做特殊的数据格式转换),这时候要么通过
AutoMigrationSpec给自动迁移补充特殊逻辑,要么直接手写完整的Migration实现。
注意:不要为了省迁移逻辑直接调用
fallbackToDestructiveMigration()方法,该配置会在数据库版本升级时直接删除所有旧表重建,会导致用户本地存储的所有业务数据被清空,正式上线版本严禁随意开启该配置。
内容的提问来源于stack exchange,提问作者Artyom Danilin
相关产品推荐
相关产品推荐

