Search code examples
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

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