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
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();
}
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>{}
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")])
).
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 :)