Jetpack Room入门系列:(一)基本介绍
Jetpack Room入门系列:(二)使用DAO读写数据库
Jetpack Room入门系列:(三)实体/数据表关系
Jetpack Room入门系列:(四)内部实现原理
Jetpack Room入门系列:(五)数据库版本升级、数据迁移
Jetpack Room入门系列:(六)配合LiveData等三方库的使用
当数据库的表结构发生变化时,我们需要通过数据库迁移(Migrations)升级表结构,避免数据丢失。
例如,我们想要为User表增加age字段
| uid | first_name | last_name |
↓↓
| uid | first_name | last_name | age |
数据迁移需要使用Migration类:
val MIGRATION_1_2 = object : Migration(1, 2) {
override fun migrate(database: SupportSQLiteDatabase) {
database.execSQL("ALTER TABLE users ADD COLUMN age INTEGER")
}
}
Migration通过startVersion
和endVersion
表明当前是哪个版本间的迁移,然后在运行时,按照版本顺序调用各Migration,最终迁移到最新的Version
创建Database时设置Migration:
Room.databaseBuilder(
applicationContext,
UserDatabase::class.java,
"users-db"
).addMigrations(MIGRATION_1_2)
.build()
迁移失效
迁移中如果找不到对应版的Migration,会抛出IllegalStateException
:
java.lang.IllegalStateException: A migration from 1 to 2 is necessary.
Please provide a Migration in the builder or call fallbackToDestructiveMigration in the builder in which case Room will re-create all of the tables.
可以添加降级处理,避免crash:
Room.databaseBuilder(
applicationContext,
UserDatabase::class.java,
"users-db"
).fallbackToDestructiveMigration()
.build()
- fallbackToDestructiveMigration:迁移失败时,重建数据库表
- fallbackToDestructiveMigrationFrom:迁移失败时,基于某版本重建数据库表
- fallbackToDestructiveMigrationOnDowngrade:迁移失败,数据库表降级到上一个正常版本