web-dev-qa-db-ja.com

Roomで汎用DAOインターフェースを作成するとき、「パラメーターのタイプは@Entityで注釈されたクラスでなければなりません」

ルームアーキテクチャコンポーネントを永続化に使用しています。ボイラープレートコードを回避するために、汎用DAOインターフェイスを作成しました。 Room Proのヒント

しかし、私のコードは「エラー:(21、19)エラー:パラメータのタイプは@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();

}

ここに欠けているものはありますか?それはこのように動作します ここ

10
xrnd

最初はKotlinで使用されている方法に従っていましたが、Javaコードでエラーが発生しました。2つの簡単な変更で修正されました

  • BaseDaoを抽象クラスに変更
  • BaseDaoに@Daoアノテーションを追加しました

以下のコードを見つけて、正しく実行されるようになりました

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

  }
5
DeeshaV

TクラスにEntityアノテーションを付け忘れたと思います。たとえば、Reasonクラスには@EntityをReasonDaoクラスに渡します。お気に入り:

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

1
nAkhmedov

その理由は、ReasonDaoタイプをReasonの代わりにジェネリックパラメーターとして指定したためです。

元のコード:

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

   ...

}

正しいコード:

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

   ...

}

ここで、Reasonは、@Entityアノテーションが付けられたタイプです。

ちなみに、これは受け入れられた回答で修正されていますが、チェンジリストには記載されていません:)

0
UneXp

私の場合、DBの非エンティティオブジェクトに保存しようとしました。次に、Entityクラスに置き換えます(@Entity(tableName = "your_table", indices = [Index("your_key")])を含む)。

0
CoolMind