Room Persistence 库什么时候开始执行数据库迁移操作?
Room数据库迁移触发时机解答
Room的数据库迁移操作不会在
RoomDatabase实例构建阶段执行,触发时机为首次对数据库发起读写操作时。
Room.databaseBuilder().build()构建数据库实例的过程仅生成轻量的代理对象,不会打开底层SQLite连接,也不会执行版本校验、迁移等IO相关操作,该步骤本身不会有性能损耗。- 只有当你第一次执行数据库操作(包括调用任意DAO的读写方法、手动调用
getOpenHelper().getWritableDatabase()等)时,Room才会真正打开数据库连接,此时触发版本校验逻辑:- 若本地数据库版本与代码中定义的版本一致,直接返回可操作的数据库实例
- 若本地版本低于代码定义的版本,按照你配置的迁移规则依次执行升级操作
- 若本地版本高于代码定义的版本且未配置降级规则,直接抛出异常
适配你的场景的实现方案
你通过Dagger Hilt注入RoomDatabase实例的场景下,注入阶段仅传递轻量的代理实例,不会触发迁移,你可以选择两种方式实现迁移前的前置配置:
- 调整业务执行顺序:在应用启动阶段先完成所有前置配置,再执行第一次数据库访问操作即可,只要不调用DAO方法,迁移就不会触发。
- 使用Room官方提供的
onPreMigrate回调:该回调是Room 2.2.0版本新增的API,会在迁移操作正式开始前执行,你可以在数据库构建时通过addCallback注册,示例代码如下:
val appDatabase = Room.databaseBuilder( context.applicationContext, AppDatabase::class.java, "app_database" ) .addMigrations(MIGRATION_1_2, MIGRATION_2_3) // 替换为你自定义的迁移规则 .addCallback(object : RoomDatabase.Callback() { override fun onPreMigrate(db: SupportSQLiteDatabase) { super.onPreMigrate(db) // 此处编写迁移前需要执行的前置配置逻辑 } }) .build()
内容的提问来源于stack exchange,提问作者Arpit Shukla
相关产品推荐
相关产品推荐

