android 错误:参数的类型必须是带@Entity注解的类或集合/数组

qyswt5oh  于 2023-10-14  发布在  Android
关注(0)|答案(4)|浏览(170)

我知道有些人已经发布了这个主题,但在审查了所有给出的答案后,我找不到任何适合我的情况。如果有人能帮我解决这个问题,我会很高兴。
当我将我的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,但它对我没有帮助。

u3r8eeie

u3r8eeie1#

我终于找到了一个解决方案,将Kotlin从1.5.31更新到1.6.10,将我的房间版本从2.3.0更新到2.4.0。
我得到的错误,来自我在嵌入式数据类中编写的函数,只要我删除它,一切都正常。

@Entity(primaryKeys = ["device_id"],)
data class DetailedDataEntity(
    @ColumnInfo(name = "device_id", index = true)
    var deviceId: String,

    @ColumnInfo(name = "unix_timestamp")
    var unixTimestamp: Long,

    @Embedded(prefix = "data_")
    var data: DetailedData
)

data class DetailedData( @ColumnInfo(name = "nameFx") val nameFx: String) {
    companion object {
        @Ignore
        fun fromData(detailedData: Protobuf.Data): DetailedData {
            return DetailedData(nameFx = detailedData.nameFx)
        }
    }
}
companion object {
         @Ignore
         fun fromData(detailedData: Protobuf.Data): DetailedData {
             return DetailedData(nameFx = detailedData.nameFx)
         }
    }

我已经删除了这个伴随对象,然后当我构建项目时,它成功地通过了。老实说,我不知道为什么会这样,但我认为这一定与我嵌入类相关的Google protobuf消息有关。

6jjcrrmo

6jjcrrmo2#

而不是kapt使用ksp这将解决问题。对我很有效。对于Kotlin1.9.0及更高版本,Google为Room和Hilt依赖性引入了ksp over kapt。

l2osamch

l2osamch3#

请不要忘记在gradle项目文件中将Kotlin& Room版本更新为最新的稳定版本。
查找最新版本的Android官方文档和最新版本的Kotlin后藤文件->设置->语言和框架->Kotlin,然后复制第一个连字符后的数字。对于212-1.7.10,选择1.7.10并在gradle中更新Kotlin版本。
It works!!

lymgl2op

lymgl2op4#

kapt迁移到ksp编译器。以此作为参考migrate-to-ksp

相关问题