ルームアーキテクチャコンポーネントを永続化に使用しています。ボイラープレートコードを回避するために、汎用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();
}
ここに欠けているものはありますか?それはこのように動作します ここ
最初はKotlinで使用されている方法に従っていましたが、Javaコードでエラーが発生しました。2つの簡単な変更で修正されました
以下のコードを見つけて、正しく実行されるようになりました
@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();
}
TクラスにEntity
アノテーションを付け忘れたと思います。たとえば、Reason
クラスには@Entity
をReasonDaoクラスに渡します。お気に入り:
@Dao public abstract class ReasonDao extends BaseDao<Reason>{}
その理由は、ReasonDaoタイプをReasonの代わりにジェネリックパラメーターとして指定したためです。
元のコード:
@Dao
public abstract class ReasonDao implements BaseDao<ReasonDao> {
...
}
正しいコード:
@Dao
public abstract class ReasonDao implements BaseDao<Reason> {
...
}
ここで、Reasonは、@Entityアノテーションが付けられたタイプです。
ちなみに、これは受け入れられた回答で修正されていますが、チェンジリストには記載されていません:)
私の場合、DBの非エンティティオブジェクトに保存しようとしました。次に、Entityクラスに置き換えます(@Entity(tableName = "your_table", indices = [Index("your_key")])
を含む)。