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,修改项目依赖配置:
如果使用KSP替代kapt,将kapt前缀的依赖改为ksp即可。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" - 添加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
相关产品推荐
相关产品推荐

