Jetpack Room入门系列:(五)数据库版本升级、数据迁移

在这里插入图片描述
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通过startVersionendVersion表明当前是哪个版本间的迁移,然后在运行时,按照版本顺序调用各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:迁移失败,数据库表降级到上一个正常版本

猜你喜欢

转载自blog.csdn.net/vitaviva/article/details/112744536