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);
}
データベースクラスを確認してください。 DAOを定義する場合、間違ったタイプ(DeviceDAOではなくDevice)を使用する必要があります。
不正解
public abstract Device deviceDao();
正しい
public abstract DeviceDAO deviceDao();
これがうまくいくことを願っています。ありがとう
エラーメッセージ: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クラスですが、MyImageはmodelクラスであり、MyImageDaoはDaoクラスです。したがって、AppDatabase.JavaクラスとMyImageをMyImageDaoに変更する必要があります。
修正されたコードは-
AppDatabase.Java
@Database(entities = {MyImage.class}, version = 1)
public abstract class AppDatabase extends RoomDatabase {
public abstract MyImageDao myImageDao();
}
インターフェースに追加のメソッドがあるかどうかを確認してください。私の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
あなたの構文は私が言えることで正しいように見えます。次のことを試しましたか?
インポートは完了していますか?
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はそれらを削除してすべて再インポートします。
Roomを使用したプロジェクトも行いましたが、同じ構文を使用しても問題はありませんでした。
追加
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などの別のエラーを引き起こすためです。
次に、プロジェクトをクリーンアップしてビルドする必要があります
それがこれを見る人を助けることを願っています
@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
であると期待しています。
すべての回答がそのクラスのコーディングエラーを示しているため、データベースのコードスニペットを追加します。