首页 文章

在Room中创建Generic DAO接口时,“参数的类型必须是使用@Entity注释的类”

提问于
浏览
7

我正在使用Room架构组件来实现持久性 . 我创建了通用DAO接口以避免样板代码 . Room Pro Tips

但是我的代码没有编译说“Error:(21,19)error:参数的类型必须是用@Entity或它的集合/数组注释的类 . ”对于通用类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();

}

这里有什么我想念的吗?它像这样工作here

4 回答

  • 1

    我最初遵循Kotlin中使用的方法,但是这给出了Java代码中的错误 . 两个快速修改为我修复了它

    • 将BaseDao更改为Abstract类

    • 将@Dao注释添加到BaseDao

    请找到下面的代码,现在它运行正常

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

    我相信你错过了给T类 Entity 注释 . 例如 Reason 类应该有 @Entity 并将其提供给ReasonDao类 . 喜欢:

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

  • 0

    在我的情况下,我试图保存到DB非实体对象 . 然后用Entity类替换(包含 @Entity(tableName = "your_table", indices = [Index("your_key")]) ) .

  • 0

    原因是您将 ReasonDao 类型指定为通用参数而不是 Reason .

    原始代码:

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

    正确的代码:

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

    其中 Reason 是标有 @Entity 注释的类型 .

    顺便说一句,这是在接受的答案中修复的,但在更改列表中没有提到:)

相关问题