【JetPack】ROOM数据库迁移指北

393 阅读2分钟

ROOM数据库框架迁移指北

ROOM数据库迁移,是当业务逻辑发生变化时,导致Entity实体的类、结构或索引需要变更时,对数据库的修改操作。
每次操作需要对数据库的版本号+1,对于不重要的数据库,可以直接升级版本号,进行破坏性更新;破坏性更新会清空数据库,使用破坏性更新之前一定要再三斟酌。

迁移步骤
  1. 添加或修改Entity实体类,确保类上已标记@Entity注解,根据业务需求添加主键及索引信息。
  2. RoomDatabase的实现类上注册该实体类,并将版本号+1。
  3. 编写对应版本的Migration类,并通过addMigrations方法注册到Room.databaseBuilder()的调用链中。
  • 注:以下汉字需要被替换成对应的英文名称,[]内的为可选参数
添加新表

CREATE TABLE IF NOT EXISTS `表名` (`字段1` 类型 [NOT NULL] [DEFAULT 默认值]...), PRIMARY KEY(`字段名`...)

添加可空字段

ALTER TABLE `表名` ADD COLUMN `新字段名` 类型

添加非空字段

因为添加非空字段会导致旧数据无法正确获取新字段的值,所以只能把旧表重命名,然后新建一张表,再将旧数据复制过去,最后删除掉旧的表
ALTER TABLE `表名` RENAME TO `temp`
CREATE TABLE IF NOT EXISTS `表名` (`字段1` 类型 [NOT NULL] [DEFAULT 默认值], `新字段名` 类型 [NOT NULL] [DEFAULT 默认值]...), PRIMARY KEY(`字段名`...)
INSERT INTO `表名` (`字段1`, `新字段名`...) SELECT (`字段1`, 默认值...) FROM `Temp`
DROP TABLE `temp`

  • 建表语句,可以先修改Entity类,然后执行该模块内的kaptDebugKotlin任务,等任务结束后,去生成的RoomDatabase实现类中找到该类的建表语句,直接复制即可。
  • 如果重建的表有索引,也必需要重新创建。
添加索引

CREATE INDEX IF NOT EXISTS `index_表名_字段名` ON `表名` (`字段名`)