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

时间:2017-12-28 22:42:44

标签: java android persistence dao android-room

我正在使用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

一样工作

5 个答案:

答案 0 :(得分:4)

我最初遵循Kotlin中使用的方法,但是这给出了Java代码中的错误。 两个快速更改为我修复了

  • 将BaseDao更改为Abstract class
  • 将@Dao注释添加到BaseDao

请找到下面的代码,现在它正常运行

@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()