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

后端 未结 4 695
鱼传尺愫
鱼传尺愫 2020-12-16 19:52

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 s

相关标签:
4条回答
  • 2020-12-16 20:12

    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();
    
      }
    
    0 讨论(0)
  • 2020-12-16 20:21

    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>{}

    0 讨论(0)
  • 2020-12-16 20:28

    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 :)

    0 讨论(0)
  • 2020-12-16 20:31

    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")])).

    0 讨论(0)
提交回复
热议问题