如何在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
相关产品推荐
相关产品推荐

