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

SqlDelight生成模型无法解析自定义Enum类问题求助

解决SqlDelight在纯JVM项目中无法访问自定义Enum类的问题

问题分析

编译失败的核心原因是SqlDelight默认将生成代码放到commonMain目录(多平台项目通用源集),而纯JVM项目的commonMain源集未关联main源集的依赖,导致生成的Model类无法解析你在src/main/kotlin下定义的CustomEnum。

解决方案

1. 修改Gradle配置,指定生成到JVM源集

调整SqlDelight的数据库配置,明确指定生成代码的目标为JVM平台,关联项目的main源集:

sqldelight {
    databases {
        create("OurDatabase") {
            srcDirs("src/main/sqldelight")
            packageName.set("my.package.model")
            // 配置生成目标为JVM,关联main源集
            target {
                targetName = "jvm"
                sourceSet = project.sourceSets.main
            }
        }
    }
}

2. 确保列适配器在JVM代码中正确注册

在src/main/kotlin下的数据库初始化代码中,正确注册EnumColumnAdapter:

import com.squareup.sqldelight.sqlite.driver.JdbcSqliteDriver
import my.package.model.OurDatabase
import my.package.model.Job
import com.squareup.sqldelight.EnumColumnAdapter

// 初始化数据库
val driver = JdbcSqliteDriver("jdbc:sqlite:your_database_name.db")
OurDatabase.Schema.create(driver)
val database = OurDatabase(
    driver = driver,
    jobAdapter = Job.Adapter(
        stateAdapter = EnumColumnAdapter()
    )
)

3. 清理并重新构建项目

执行Gradle任务清除旧生成代码,再重新构建:

./gradlew clean build

关于commonMain的说明

SqlDelight默认面向Kotlin多平台项目设计,即使仅使用JVM平台,它也会默认生成代码到commonMain源集。这个源集在纯JVM项目中没有配置对main源集的依赖访问权限,因此无法解析自定义Enum。通过指定target为JVM,生成代码会直接放到JVM专属源集,解决依赖访问问题。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.17 03:02:05