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

如何在KMP应用中通过代码迁移实现SQLDelight数据库迁移?

SQLDelight 代码迁移:代码位置与生效步骤

代码放置位置

  • 多平台项目:代码迁移逻辑优先放在共享模块(如commonMain目录),因为迁移逻辑通常跨平台通用;若有平台特定的迁移操作,再放到对应平台的源码目录(如androidMain、iosMain)。
  • 单平台项目(如Android):直接放在项目的主源码目录(如src/main/java)即可,只要保证初始化SqlDriver的代码能访问到该迁移类。
  • 具体实现:你需要创建一个实现SqlDriver.Migration接口的类,或者在初始化驱动时直接传入匿名实现,位置无强制限制,核心是能被驱动初始化代码引用。

生效所需额外操作

  • 绑定迁移到SqlDriver:初始化SqlDriver时,必须将代码迁移实例传入驱动配置。示例代码:
// 多平台通用写法
val driver = YourDatabase.Schema.createDriver(
  driver = SqliteDriver(context),
  migrations = listOf(YourCustomMigration)
)

// 或链式调用添加迁移
val driver = SqliteDriver(context).let {
  YourDatabase.Schema.createDriver(it).addMigration(YourCustomMigration)
}
  • 正确实现Migration接口:迁移类必须指定version属性(对应目标schema版本号),并在migrate方法中编写具体的迁移逻辑(比如数据转换、自定义表操作)。示例:
object YourCustomMigration : SqlDriver.Migration {
  override val version = 2 // 目标版本号
  override fun migrate(driver: SqlDriver) {
    // 自定义迁移逻辑,比如更新某列数据
    driver.execute(null, "UPDATE user SET status = 'active' WHERE status IS NULL", 0)
  }
}
  • 版本顺序校验:代码迁移的版本号必须与SQLDelight的schema版本序列对应,按升序执行,不能跳过中间版本。
  • 单平台额外注意:Android平台需确保驱动初始化代码在Application类或数据库单例中,保证迁移逻辑只执行一次。

内容的提问来源于stack exchange,提问作者Alex Luque

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.13 15:42:06