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

KMP项目中SQLDelight生成的DAO文件出现错误导入问题

问题根源及解决方案

核心问题

生成的代码错误引入JDBC类,是因为SQLDelight默认生成了JVM平台专属代码,而KMP的common模块需要通用的跨平台SQLDelight接口,同时你可能没正确配置多平台驱动依赖和代码生成规则。

具体原因

  1. 未开启通用数据库接口生成:默认情况下SQLDelight会为当前构建平台生成专属代码,JVM环境下就会依赖JDBC相关类,但common模块需要通用的SqlCursor/SqlPreparedStatement而非JDBC实现。
  2. 驱动依赖配置错误:JDBC驱动属于JVM平台依赖,不应在common模块引入,需要按平台拆分驱动依赖。

解决步骤

1. 修正SQLDelight插件配置(common模块build.gradle.kts)

确保开启通用数据库接口生成,指定正确的包名:

sqldelight {
    databases {
        create("YourDatabase") { // 替换成你的数据库名称
            packageName.set("com.your.package") // 替换成你的实际包路径
            generateCommonDatabaseInterface.set(true) // 关键:生成跨平台通用代码
        }
    }
}

2. 拆分平台依赖

  • common模块仅保留跨平台核心依赖:
implementation("app.cash.sqldelight:runtime:2.0.2")
implementation("app.cash.sqldelight:coroutines-extensions:2.0.2")
  • JVM模块单独添加JDBC驱动:
implementation("app.cash.sqldelight:jdbc-driver:2.0.2")
  • Android模块添加SQLite驱动:
implementation("app.cash.sqldelight:android-driver:2.0.2")
  • iOS模块添加原生驱动:
implementation("app.cash.sqldelight:native-driver:2.0.2")

3. 确保DatabaseDriverFactory的平台实现正确

每个平台的actual类要使用对应平台的驱动:

  • JVM示例:
actual class DatabaseDriverFactory {
    actual fun createDriver(): SqlDriver {
        return JdbcSqlDriver(YourDatabase.Schema, "jdbc:sqlite:app.db")
    }
}
  • Android示例:
actual class DatabaseDriverFactory(private val context: Context) {
    actual fun createDriver(): SqlDriver {
        return AndroidSqlDriver(YourDatabase.Schema, context, "app.db")
    }
}

4. 清理并重新构建项目

执行命令清理缓存后重新构建:

./gradlew clean build

内容的提问来源于stack exchange,提问作者jan h

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.16 00:40:57