参数的类型必须是带有 @Entity 注释的类或其集合/数组

Posted

技术标签:

【中文标题】参数的类型必须是带有 @Entity 注释的类或其集合/数组【英文标题】:Type of the parameter must be a class annotated with @Entity or a collection/array of it 【发布时间】:2018-07-05 08:32:23 【问题描述】:

好的,所以我尝试按照本指南进行操作:https://medium.com/google-developers/7-pro-tips-for-room-fbadea4bfbd1 这导致我得到这个代码:https://gist.github.com/florina-muntenescu/1c78858f286d196d545c038a71a3e864

当我遇到以下两个错误时,我尝试制作自己的示例:

错误:参数的类型必须是带有@Entity 注释的类或 它的集合/数组。

错误:不能在 Dao 类中使用未绑定的泛型。如果你想 创建一个基础 DAO,创建一个普通类,使用类型参数对其进行扩展 然后用@Dao 标记子类。

我不知道这两个错误是否相互关联,但我看不出它们发生在哪里,并且不能排除它们是相关的。

@Entity
public class Data 
@PrimaryKey
uuid: String
title: String

我的父道

@Dao
abstract class BaseDao<in T> 

@Insert
abstract fun insert(obj: T)

@Insert
abstract fun insert(vararg obj: T)

@Update
abstract fun update(obj: T)

@Delete
abstract fun delete(obj: T)

我的子类 dao

@Dao
abstract class SubclassDao : BaseDao<Data> 

@Query("SELECT * FROM Data WHERE uuid = :id")
abstract fun getDataById(id: String): LiveData<Data>

@Query("SELECT * FROM BowelMovementEvent")
abstract fun getData(): List<Data>

@Query("SELECT * FROM BowelMovementEvent")
abstract fun getEventById(id: String): LiveData<Data>

【问题讨论】:

【参考方案1】:

我遇到了同样的错误

@Insert
fun insertCars(vararg cars: List<Car>)

我通过删除 vararg

修复了它
@Insert
fun insertCars(cars: List<Car>)

【讨论】:

【参考方案2】:

致任何有问题的人:参数的类型必须是带有 @Entity 注释的类或其集合/数组

此错误表明使用 BaseDao 的 Dao 没有该数据类型的有效类。例如here 在此代码中,DataDao 定义要使用的类数据类型是类型“Data”(DataDao.kt 的第 23 行),它由包含 @Entity 标记的 Data.kt 类定义(Data 的第 22 行) .kt)。

所以...如果您遇到此错误,则该错误不是源自 BaseDao 接口,而是源自使用 BaseDao 的 Dao。

我希望这会有所帮助!

【讨论】:

以上是关于参数的类型必须是带有 @Entity 注释的类或其集合/数组的主要内容,如果未能解决你的问题,请参考以下文章

在 Room 中创建通用 DAO 接口时,“参数的类型必须是带有 @Entity 注释的类”

Java 泛型总结

Scala之类型参数和对象

使用带有某些基类、抽象类或特征的列表参数化的类型类的最佳方法

为什么不能引用在Swift项目的同一目录中创建的类或结构?

Hibernate 不会在 h2 中为使用 @Entity 注释的类创建专用表