web-dev-qa-db-fra.com

Erreur Android Room: la classe Dao doit être annotée avec @Dao

J'utilise Room pour mon application Android. J'essaie maintenant de configurer ma base de données, mais un message d'erreur indique que la classe Dao doit être annotée avec @Dao. Mais comme vous pouvez le voir dans l'extrait de code, la classe Dao est annotée avec @Dao. Est-ce que quelqu'un sait où le problème ou mon erreur pourrait être? Les deux fichiers ne sont pas dans le même dossier (DAO se trouve dans le dossier de service tandis que l'autre classe est dans le dossier de modèle)

Device.Java

@Entity(tableName = "device")
public class Device {

    @PrimaryKey(autoGenerate = true)
    public int device_id;

    @ColumnInfo(name = "identifier")
    public String identifier;

    @ColumnInfo(name = "language")
    public int language;

    @ColumnInfo(name = "searchFilter")
    public int searchFilter;

    public Device(String identifier, int language, int searchFilter){
        this.identifier = identifier;
        this.language = language;
        this.searchFilter = searchFilter;
    }
}

DeviceDAO.Java

@Dao
public interface DeviceDAO {
    @Insert(onConflict = OnConflictStrategy.REPLACE)
    void addDevicePreferences(DifficultType difficultType);

    @Query("SELECT * FROM device")
    List<Device> selectAllDevicePreferences();

    @Update(onConflict = OnConflictStrategy.REPLACE)
    void updateDevicePreferences(Device device);
}
6
Prizrenali

Message d'erreur: La classe Dao doit être annotée avec @Dao

Pour résoudre l'erreur s'il vous plaît lisez-le correctement.

Si ce message d'erreur s'affiche sur la classe Model, vous devez modifier votre classe AppDatabase. Je vous donne le code ce qui donne une erreur puis un code corrigé.

Code d'erreur:

MyImage.Java

@Entity
public class MyImage {
    @PrimaryKey(autoGenerate = true)
    private int uid;
    @ColumnInfo(name = "title")
    private String title;
    @ColumnInfo(name = "photo")
    private String photo;

    public MyImage(String title, String photo) {
        this.title = title;
        this.photo = photo;
    }

    public int getUid() {
        return uid;
    }

    public void setUid(int uid) {
        this.uid = uid;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public String getPhoto() {
        return photo;
    }

    public void setPhoto(String photo) {
        this.photo = photo;
    }
}

MyImageDao.Java

@Dao
public interface MyImageDao {
    @Query("SELECT * FROM myimage")
    List<MyImage> getAll();

    @Insert
    void insertAll(MyImage... myImages);

    @Delete
    void delete(MyImage myImage);
}

AppDatabase.Java

@Database(entities = {MyImage.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract MyImage myImageDao();
}

Ici il y a une erreur sur le fichier AppDatabase.Java uniquement, vous pouvez voir myImageDao a le type de retour MyImage , cela signifie qu'il suppose que MyImage est un Dao class mais MyImage is model class et MyImageDao is Dao class . Il faut donc modifier la classe AppDatabase.Java et MyImage en MyImageDao .

Le code corrigé est -

AppDatabase.Java

@Database(entities = {MyImage.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
    public abstract MyImageDao myImageDao();
}
6

Vérifiez si vous avez des méthodes supplémentaires dans votre interface. Dans mon implémentation de Kotlin, j'avais: 

@Dao interface DeviceDao {
    @get:Query("SELECT * FROM extdevice")
    val all: List<ExtDevice>

    fun first() : ExtDevice? {
        val devices = all
        if (devices.isNotEmpty())
            return devices[0]
        return null
    }
}

enlever first () a résolu mon problème:

@Dao interface DeviceDao {
    @get:Query("SELECT * FROM extdevice")
    val all: List<ExtDevice>
}

Votre syntaxe semble correcte d'après ce que je peux dire. Avez-vous essayé les choses suivantes:

  1. Vos importations sont-elles complètes?

    importer Android.Arch.persistence.room.Dao; importer Android.Arch.persistence.room.Delete; importer Android.Arch.persistence.room.Insert; importer Android.Arch.persistence.room .OnConflictStrategy; Importer Android.Arch.persistence.room.Query; Importer Android.Arch.persistence.room.Update;

Mabe les supprimer et les réimporter tous.

  1. Avez-vous reconstruit/Gradel Construire le projet?

J'ai aussi fait un projet avec Room et je n'ai eu aucun problème à avoir la même syntaxe. 

0
Andreas Imsand