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

Kotlin升级1.6.0后Android Room BaseDao编译报错求解

问题根因

Kotlin 1.6.0调整了suspend函数的字节码生成逻辑,低于2.4.0版本的Room无法正确识别suspend修饰的DAO方法,会把suspend函数隐含的Continuation参数识别为DAO的入参,进而触发类型校验错误。

解决方案

按以下优先级依次操作即可解决:

  • 升级Room到兼容版本
    Kotlin 1.6.0需要匹配2.4.0及以上版本的Room,修改项目依赖配置:
    def room_version = "2.4.3"
    implementation "androidx.room:room-runtime:$room_version"
    kapt "androidx.room:room-compiler:$room_version"
    implementation "androidx.room:room-ktx:$room_version"
    
    如果使用KSP替代kapt,将kapt前缀的依赖改为ksp即可。
  • 添加BaseDao泛型约束
    给BaseDao的泛型添加上界约束,明确传入的泛型类型为合法实体类,修改代码如下:
    interface BaseDao<T : Any> {
        @Insert(onConflict = OnConflictStrategy.IGNORE)
        suspend fun insert(obj: T): Long
    
        @Insert
        suspend fun insert(vararg obj: T): LongArray
    
        @Update(onConflict = OnConflictStrategy.REPLACE)
        suspend fun update(obj: T)
    
        @Delete
        suspend fun delete(obj: T)
    }
    
    @Transaction
    suspend inline fun <reified T : Any> BaseDao<T>.insertOrUpdate(item: T) {
        if (insert(item) != -1L) return
        update(item)
    }
    
  • 清空构建缓存重试
    执行命令清空本地构建缓存,避免旧编译产物引发异常:
    ./gradlew clean
    
    执行完成后重新触发项目构建即可。

注:请提前确认你的业务实体类CustomEntity已正确添加@Entity注解,且符合Room实体类的定义规范。

内容的提问来源于stack exchange,提问作者K. Donon

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.09.25 16:36:07