我正在使用Room架构组件来实现持久性。我创建了通用DAO接口以避免样板代码。 Room Pro Tips
但是我的代码没有编译说错误:(21,19)错误:参数的类型必须是用@Entity或它的集合/数组注释的类。“对于通用类T。
interface BaseDao<T> {
@Insert(onConflict = OnConflictStrategy.REPLACE)
void insert(T... entity);
@Update
void update(T entity);
@Delete
void delete(T entity);
}
@Dao
public abstract class ReasonDao implements BaseDao<ReasonDao> {
@Query("SELECT * from Reason")
abstract public List<Reason> getReasons();
}
这里有什么我想念的。 它像here
一样工作答案 0 :(得分:4)
我最初遵循Kotlin中使用的方法,但是这给出了Java代码中的错误。 两个快速更改为我修复了
请找到下面的代码,现在它正常运行
@Dao
abstract class BaseDao<T> {
@Insert(onConflict = OnConflictStrategy.REPLACE)
abstract void insert(T entity);
@Update
abstract void update(T entity);
@Delete
abstract void delete(T entity);
}
@Dao
public abstract class ReasonDao extends BaseDao<Reason>{
@Query("SELECT * from Reason")
abstract public List<Reason> getReasons();
}
答案 1 :(得分:1)
我相信你错过了给T类提供Entity
注释。例如Reason
类应该有@Entity
并将其提供给ReasonDao类。像:
@Dao
public abstract class ReasonDao extends BaseDao<Reason>{}
答案 2 :(得分:0)
在我的情况下,我试图保存到DB非实体对象。然后替换为Entity类(包含@Entity(tableName = "your_table", indices = [Index("your_key")])
)。
答案 3 :(得分:0)
原因是您将 ReasonDao 类型指定为通用参数,而不是 Reason 。
原始代码:
@Dao
public abstract class ReasonDao implements BaseDao<ReasonDao> {
...
}
正确的代码:
@Dao
public abstract class ReasonDao implements BaseDao<Reason> {
...
}
其中 原因 是标有 @Entity 批注的类型。
顺便说一句,这已在已接受的答案中解决,但未在变更列表中提及:)
答案 4 :(得分:0)
这里缺少的是 Data 类。一般来说, @Entity 代表你要存储的对象,
@Entity(tableName="something") data class YourData()