我知道有些人已经发布了这个主题,但在审查了所有给出的答案后,我找不到任何适合我的情况。如果有人能帮我解决这个问题,我会很高兴。
当我将我的Kotlin库从1.5.31更新到1.6.0时,我的构建开始失败。我的Android Room BaseDao
类无法再次编译。下面是BaseDao
类:
interface BaseDao<T> {
/**
* Insert an object in the database.
*
*/
@Insert(onConflict = OnConflictStrategy.IGNORE)
suspend fun insert(obj: T): Long
/**
* Insert an array of objects in the database.
*
* @param obj the objects to be inserted.
*/
@Insert
suspend fun insert(vararg obj: T): LongArray
/**
* Update an object from the database.
*
* @param obj the object to be updated
*/
@Update(onConflict = OnConflictStrategy.REPLACE)
suspend fun update(obj: T)
/**
* Delete an object from the database
*
* @param obj the object to be deleted
*/
@Delete
suspend fun delete(obj: T)
}
@Transaction
suspend inline fun <reified T> BaseDao<T>.insertOrUpdate(item: T) {
if (insert(item) != -1L) return
update(item)
}
构建后:
java:19:错误:参数的类型必须是带@Entity注解的类或它的集合/数组。
Kotlin.协程.Continuation<?super java.lang.Long> continuation);
错误:不确定如何处理插入方法的返回类型。
public abstract java.lang.Object insert(T obj,@org.jetbrains.annotations. Nothing())
下面是我在一个Dao
类中调用BaseDao
的方法:
@Dao
interface CustomDao : BaseDao<CustomEntity> {
}
我试过@JvmSuppressWildcards
,但它对我没有帮助。
4条答案
按热度按时间u3r8eeie1#
我终于找到了一个解决方案,将Kotlin从1.5.31更新到1.6.10,将我的房间版本从2.3.0更新到2.4.0。
我得到的错误,来自我在嵌入式数据类中编写的函数,只要我删除它,一切都正常。
我已经删除了这个伴随对象,然后当我构建项目时,它成功地通过了。老实说,我不知道为什么会这样,但我认为这一定与我嵌入类相关的Google protobuf消息有关。
6jjcrrmo2#
而不是kapt使用ksp这将解决问题。对我很有效。对于Kotlin1.9.0及更高版本,Google为Room和Hilt依赖性引入了ksp over kapt。
l2osamch3#
请不要忘记在gradle项目文件中将Kotlin& Room版本更新为最新的稳定版本。
查找最新版本的Android官方文档和最新版本的Kotlin后藤文件->设置->语言和框架->Kotlin,然后复制第一个连字符后的数字。对于212-1.7.10,选择1.7.10并在gradle中更新Kotlin版本。
It works!!
lymgl2op4#
从
kapt
迁移到ksp
编译器。以此作为参考migrate-to-ksp