升级Kotlin 1.7.0后Android Room使用kapt编译报错如何解决?
问题描述
为适配最新版Jetpack Compose将项目Kotlin版本升级至1.7.0后,原本使用kapt作为注解处理器的Android Room无法正常工作,编译阶段抛出如下错误:
error: Query method parameters should either be a type that can be converted into a database column or a List / Array that contains such type. You can consider adding a Type Adapter for this.
(错误译文:查询方法的参数必须是可转换为数据库列的类型,或是由这类类型构成的List/Array,你可以为当前使用的类型添加自定义类型适配器)
问题原因
这个报错多数情况下不是代码里真的用了Room不支持的参数类型。核心原因是Kotlin 1.7.0调整了kapt对Kotlin空值标记的传递规则,2.4.3版本以下的Room注解处理器无法正确识别Kotlin代码中定义的基础类型参数(包括String、Int、Long等Room原生支持的类型),会误判为未注册类型转换器的自定义类型抛出错误。
修复方案
按优先级选择对应方案处理即可:
- 最直接的方案是将所有Room相关依赖(room-runtime、room-compiler、room-ktx等)统一升级到
2.4.3及以上的稳定版本,新版本已官方适配Kotlin 1.7.0的kapt处理逻辑,升级后无需修改业务代码即可正常编译。 - 如果受项目整体依赖限制暂时无法升级Room版本,可以在模块级的build.gradle文件中为kapt增加配置参数,修正类型识别逻辑,参考配置如下:
// 模块级build.gradle文件内 kapt { arguments { arg("room.incremental", "true") // 原有配置比如room.schemaLocation等参数保留即可 } }
- 如果上述操作完成后仍有报错,再检查对应Dao的查询方法:如果参数用了枚举、自定义实体类、日期类等Room原生不支持的类型,补充对应的@TypeConverter类型转换器即可;如果参数是Room原生支持的基础类型,执行
./gradlew clean清理构建缓存后重新编译即可。
内容的提问来源于stack exchange,提问作者Arnyminer Z
相关产品推荐
相关产品推荐

