You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Room Persistence 库什么时候开始执行数据库迁移操作?

Room数据库迁移触发时机解答

Room的数据库迁移操作不会在RoomDatabase实例构建阶段执行,触发时机为首次对数据库发起读写操作时。

  • Room.databaseBuilder().build()构建数据库实例的过程仅生成轻量的代理对象,不会打开底层SQLite连接,也不会执行版本校验、迁移等IO相关操作,该步骤本身不会有性能损耗。
  • 只有当你第一次执行数据库操作(包括调用任意DAO的读写方法、手动调用getOpenHelper().getWritableDatabase()等)时,Room才会真正打开数据库连接,此时触发版本校验逻辑:
    • 若本地数据库版本与代码中定义的版本一致,直接返回可操作的数据库实例
    • 若本地版本低于代码定义的版本,按照你配置的迁移规则依次执行升级操作
    • 若本地版本高于代码定义的版本且未配置降级规则,直接抛出异常

适配你的场景的实现方案

你通过Dagger Hilt注入RoomDatabase实例的场景下,注入阶段仅传递轻量的代理实例,不会触发迁移,你可以选择两种方式实现迁移前的前置配置:

  1. 调整业务执行顺序:在应用启动阶段先完成所有前置配置,再执行第一次数据库访问操作即可,只要不调用DAO方法,迁移就不会触发。
  2. 使用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

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.10.05 08:30:03