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

