Android Room错误:Dao类必须用@Dao注释

问题描述 投票:0回答:10

我正在将 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);
}
java android database android-room
10个回答
36
投票

检查您的数据库类。当你定义DAO时,你一定使用了错误的类型(Device而不是DeviceDAO)。

不正确

public abstract Device deviceDao();

正确

public abstract DeviceDAO deviceDao();

希望这会起作用。谢谢


12
投票

错误信息: 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,这意味着它假设 MyImageDao 类,但 MyImagemodel 类和 MyImageDao Dao 类。 所以需要修改AppDatabase.java类和MyImageMyImageDao

更正后的代码是-

AppDatabase.java

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

3
投票

我面临着同样的问题,经过一段时间的挣扎,我意识到在数据库类中,我创建了一个 Entity 类的变量而不是 Dao 类。


2
投票

对于 Kotlin 用户:

检查您是否在数据库文件中添加了以下行。

抽象值 myDatabaseDao:MyDatabaseDao


1
投票

检查接口中是否有任何其他方法。在我的 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>
}

1
投票

添加

import androidx.room.Dao;

到您在其上设置查询的界面,然后添加此代码中的第一行

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

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


0
投票

据我所知,你的语法看起来是正确的。您是否尝试过以下操作:

  1. 您的导入完成了吗?

    导入 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;

可以删除它们并重新导入全部。

  1. 您重建/Gradel 构建项目了吗?

我也用 Room 做了一个项目,并且使用相同的语法没有任何问题。


0
投票

就我而言,我已经实现了 @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
投票
@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

添加数据库的代码片段,因为所有答案都指向该类中的编码错误。


0
投票

就我而言,我删除了一个 Dao 并忘记将其从数据库中删除

    abstract fun testDao(): TestDao

android studio 和 gradle 根本没有显示我的这个错误

© www.soinside.com 2019 - 2024. All rights reserved.