我正在将 Room 用于我的 Android 应用程序。我现在正在尝试设置数据库,但出现一条错误消息,指出 Dao 类必须使用 @Dao 进行注释。但正如您在代码片段中看到的,Dao 类使用 @Dao 进行注释。有谁知道问题或我的错误可能出在哪里?两个文件不在同一个文件夹中(DAO 在服务文件夹中,而另一个类在模型文件夹中)
设备.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时,你一定使用了错误的类型(Device而不是DeviceDAO)。
不正确
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();
}
我面临着同样的问题,经过一段时间的挣扎,我意识到在数据库类中,我创建了一个 Entity 类的变量而不是 Dao 类。
对于 Kotlin 用户:
检查您是否在数据库文件中添加了以下行。
抽象值 myDatabaseDao:MyDatabaseDao
检查接口中是否有任何其他方法。在我的 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>
}
添加
import androidx.room.Dao;
到您在其上设置查询的界面,然后添加此代码中的第一行
@Dao
public interface UserDeo {
@Query("SELECT * FROM user")
List<User> getAllUsers();
@Insert
void insertAll(User... users);
}
据我所知,你的语法看起来是正确的。您是否尝试过以下操作:
您的导入完成了吗?
导入 android.arch.persistence.room.Dao; 导入 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;
可以删除它们并重新导入全部。
我也用 Room 做了一个项目,并且使用相同的语法没有任何问题。
就我而言,我已经实现了 @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 是一个类,
@Entity
,我已在我的数据库中声明它是抽象的
这会引发:
“错误:Dao 类必须用 @Dao 注解”
即使你正确地声明了你的 dao。
也许您在数据库中的某个位置将您的类声明为
abstract
,而数据库希望它是一个可以实现的抽象 Dao
。
添加数据库的代码片段,因为所有答案都指向该类中的编码错误。
就我而言,我删除了一个 Dao 并忘记将其从数据库中删除
abstract fun testDao(): TestDao
android studio 和 gradle 根本没有显示我的这个错误