javaandroidpersistencedaoandroid-room

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


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


Solution

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

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