SQLDelight 2.0.0保存布尔值报错‘Unresolved reference: Boolean’的解决方法
解决SQLDelight 2.0.0中布尔值类型映射的"Unresolved reference: Boolean"错误
问题原因
SQLDelight 2.0.0默认未内置布尔类型的数据库与Kotlin类型转换器,直接在SQL语句中使用INTEGER AS Boolean时,生成的Kotlin代码无法识别Boolean类型,导致编译错误。
解决方案
方法一:使用官方Primitive Adapters依赖(推荐)
添加依赖
在共享模块的commonMain依赖块中引入SQLDelight的primitive-adapters库,该库提供了布尔、字节等基础类型的现成转换器:sourceSets { commonMain.dependencies { // 其他已有依赖... implementation(libs.sqlDelight.primitive.adapters) } }如果使用
libs.versions.toml管理版本,需要先在文件中添加依赖定义:[versions] sqlDelight = "2.0.0" [libraries] sqlDelight-primitive-adapters = { module = "app.cash.sqldelight:primitive-adapters", version.ref = "sqlDelight" }同步并构建项目
执行Gradle同步,重新构建项目后,SQLDelight就能正确识别INTEGER AS Boolean的类型映射,自动生成将数据库INTEGER值转换为Kotlin Boolean的代码(0对应false,非0对应true,null保持为null)。
方法二:自定义布尔类型转换器
如果不想引入额外依赖,可以手动实现类型转换器:
创建转换器类
在commonMain源码目录下创建布尔类型适配器:package org.sn.spacexkmp.shared.cache import app.cash.sqldelight.ColumnAdapter object BooleanAdapter : ColumnAdapter<Boolean?, Int?> { override fun decode(databaseValue: Int?): Boolean? { return databaseValue?.let { it != 0 } } override fun encode(value: Boolean?): Int? { return value?.let { if (it) 1 else 0 } } }配置SQLDelight使用转换器
在Gradle的SQLDelight配置中指定该适配器:sqldelight { databases { create("AppDatabase") { packageName.set("org.sn.spacexkmp.shared.cache") addAdapters.set(listOf("org.sn.spacexkmp.shared.cache.BooleanAdapter")) } } }重新构建项目
同步Gradle并构建,即可解决类型引用错误。
验证
保持SQL语句中的launchSuccess INTEGER AS Boolean DEFAULT NULL写法不变,构建后生成的Launch数据类中launchSuccess字段会被正确定义为Boolean?类型,可直接在Kotlin代码中使用布尔值进行数据库读写操作。
内容的提问来源于stack exchange,提问作者Saeed Noshadi
相关产品推荐
相关产品推荐

