web-dev-qa-db-ja.com

Androidルームエラー:Daoクラスには@Daoアノテーションを付ける必要があります

Androidアプリ用にRoomを使用しています。データベースをセットアップしようとしていますが、Daoクラスには@Daoアノテーションを付ける必要があるというエラーメッセージが表示されます。しかし、コーディングスニペットでわかるように、Daoクラスには@Daoの注釈が付けられています。誰が問題や私の間違いの可能性を知っていますか?両方のファイルが同じフォルダーにありません(DAOはサービスフォルダーにあり、他のファイルはクラスはモデルフォルダにあります)

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);
}
8
Prizrenali

データベースクラスを確認してください。 DAOを定義する場合、間違ったタイプ(DeviceDAOではなくDevice)を使用する必要があります。

不正解

public abstract Device deviceDao();

正しい

public abstract DeviceDAO deviceDao();

これがうまくいくことを願っています。ありがとう

26

エラーメッセージ:Daoクラスには@Daoアノテーションを付ける必要があります

エラーを解決するには、適切に読んでください。

このエラーメッセージがModelクラスに表示される場合は、AppDatabaseクラスを変更する必要があります。私はあなたにエラーを与えるコード、そしてエラー修正されたコードをあなたに与えています。

エラーコード:

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

ここでエラーが発生するのはAppDatabase.Javaファイルのみです。myImageDaoの戻り値の型MyImageを確認できます。つまり、MyImageは- Daoクラスですが、MyImagemodelクラスであり、MyImageDaoDaoクラスです。したがって、AppDatabase.JavaクラスとMyImageMyImageDaoに変更する必要があります。

修正されたコードは-

AppDatabase.Java

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

インターフェースに追加のメソッドがあるかどうかを確認してください。私のKotlin実装では、次のことがありました。

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

first()を削除すると問題が解決しました:

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

Kotlinユーザーの場合:

データベースファイルに次の行を追加したかどうかを確認します。

抽象値myDatabaseDao:MyDatabaseDao

1
Shivam Sompura

あなたの構文は私が言えることで正しいように見えます。次のことを試しましたか?

  1. インポートは完了していますか?

    android.Arch.persistence.room.Daoをインポートします。 import Android.Arch.persistence.room.Delete; Android.Arch.persistence.room.Insert;をインポートします。 Android.Arch.persistence.room.OnConflictStrategyをインポートします。 Android.Arch.persistence.room.Query;をインポートします。 Android.Arch.persistence.room.Updateをインポートします。

Mabeはそれらを削除してすべて再インポートします。

  1. プロジェクトをリビルド/ Gradelビルドしましたか?

Roomを使用したプロジェクトも行いましたが、同じ構文を使用しても問題はありませんでした。

0
Andreas Imsand

追加

import androidx.room.Dao;

インターフェースにクエリを設定し、このコードの最初の行を追加します

@Dao
public interface UserDeo {
    @Query("SELECT * FROM user")
    List<User> getAllUsers();

    @Insert
    void insertAll(User... users);
}

私の場合、@ Daoアノテーションを実装してもエラーが発生します。エラーは:

error: Dao class must be annotated with @Dao public final class NonExistentClass{ }

部屋の依存関係のバージョンが他のバージョンと同じであることを確認してください。私の部屋の依存関係:

    kapt "androidx.room:room-compiler:2.2.0"
    implementation "androidx.room:room-runtime:2.2.0"
    implementation "androidx.room:room-ktx:2.2.0"

注釈プロセッサの代わりにkaptを使用することを忘れないでください:

apply plugin: 'kotlin-kapt'

build.gradleモジュールアプリの上。これは、annotationProcessorがdatabase_implなどの別のエラーを引き起こすためです。

次に、プロジェクトをクリーンアップしてビルドする必要があります

それがこれを見る人を助けることを願っています

0
Hammad Syarif
@Database(entities = {ObjInspectionSqlite.class}, version = 2, exportSchema = false)
@TypeConverters({InspeccionDateTypeConverter.class})
public abstract class DataBaseInspections extends RoomDatabase {

    public static BaseDeDatosInspecciones instance;

    public abstract InspectionsDao inspectionsDao();
    public abstract ObjInspectionSqlite inspectionSqlite();
    ...
}

ObjInspectionSqliteはクラスwhit@Entity、そしてそれを私のデータベースで抽象的に宣言しました

これは投げます:

「エラー:Daoクラスには@Daoアノテーションを付ける必要があります」

daoを正しく宣言した場合でも

多分あなたはあなたのクラスをあなたのデータベースのどこかでabstractとして宣言しました、そしてDBはそれが実装可能な抽象Daoであると期待しています。

すべての回答がそのクラスのコーディングエラーを示しているため、データベースのコードスニペットを追加します。

0
FranK