“Type of the parameter must be a class annotated with @Entity” while creating Generic DAO interface in Room

自闭症网瘾萝莉.ら 提交于 2019-11-30 03:10:19

问题


I am using Room architecture component for persistence. I have created generic DAO interface to avoid boilerplate code. Room Pro Tips

But my code doesn't compile saying "Error:(21, 19) error: Type of the parameter must be a class annotated with @Entity or a collection/array of it." for the Generic class 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();

}

Is there anything I am missing here. It works like this here


回答1:


I had initially followed the method used in Kotlin, but that gives the error in Java code. Two quick changes fixed it for me

  • Change BaseDao to Abstract class
  • Added @Dao annotation to the BaseDao

Please find the code below and now it runs properly

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

  }



回答2:


I believe is that you have missed to give Entity annotation to T class. For example Reason class should have @Entity and give it to ReasonDao class. Like:

@Dao public abstract class ReasonDao extends BaseDao<Reason>{}




回答3:


In my case I tried to save to DB non-Entity objects. Then replaced with Entity class (contains @Entity(tableName = "your_table", indices = [Index("your_key")])).




回答4:


The reason is that you specified ReasonDao type as generic parameter instead of Reason.

Original code:

@Dao
public abstract class ReasonDao implements BaseDao<ReasonDao> {

   ...

}

Correct code:

@Dao
public abstract class ReasonDao implements BaseDao<Reason> {

   ...

}

where Reason is the type marked with @Entity annotation.

By the way, this is fixed in the accepted answer, but is not mentioned in the changelist :)



来源:https://stackoverflow.com/questions/48015280/type-of-the-parameter-must-be-a-class-annotated-with-entity-while-creating-ge

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!