KMP项目中SQLDelight生成的DAO文件出现错误导入问题
问题根源及解决方案
核心问题
生成的代码错误引入JDBC类,是因为SQLDelight默认生成了JVM平台专属代码,而KMP的common模块需要通用的跨平台SQLDelight接口,同时你可能没正确配置多平台驱动依赖和代码生成规则。
具体原因
- 未开启通用数据库接口生成:默认情况下SQLDelight会为当前构建平台生成专属代码,JVM环境下就会依赖JDBC相关类,但common模块需要通用的
SqlCursor/SqlPreparedStatement而非JDBC实现。 - 驱动依赖配置错误: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
相关产品推荐
相关产品推荐

