web-dev-qa-db-fra.com

"Le type du paramètre doit être une classe annotée avec @Entity" lors de la création d'une interface DAO générique dans Room

J'utilise un composant d'architecture de pièce pour la persistance. J'ai créé une interface DAO générique pour éviter le code passe-partout. Astuces Room Pro

Mais mon code ne compile pas en disant "Erreur: (21, 19) erreur: Le type du paramètre doit être une classe annotée avec @Entity ou une collection/tableau de celle-ci" pour la classe générique 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();

}

Y a-t-il quelque chose qui me manque ici? Cela fonctionne comme ceci ici

7
xrnd

J'avais initialement suivi la méthode utilisée dans Kotlin, mais cela donne l'erreur en code Java. Deux changements rapides résolus pour moi

  • Changer BaseDao en classe abstraite 
  • Ajout de l'annotation @Dao à BaseDao

S'il vous plaît trouver le code ci-dessous et maintenant il fonctionne correctement 

@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
xrnd

Je crois que vous avez manqué de donner l'annotation Entity à la classe T. Par exemple, la classe Reason devrait avoir @Entity et le donner à la classe ReasonDao. Comme:

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

1
nAkhmedov

La raison est que vous avez spécifiéReasonDaotype en tant que paramètre générique au lieu deReason.

Code d'origine:

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

   ...

}

Code correct:

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

   ...

}

Reasonest le type marqué par@Entityannotation.

En passant, cela est corrigé dans la réponse acceptée, mais n'est pas mentionné dans la liste des modifications :) 

0
UneXp

Dans mon cas, j'ai essayé de sauvegarder dans des objets DB non-Entity. Puis remplacé par la classe d'entité (contient @Entity(tableName = "your_table", indices = [Index("your_key")])).

0
CoolMind