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

时间:2017-11-06 23:01:07

标签: java android database android-room

我正在使用Room for my android app。我现在正在尝试设置我的数据库,但是有一条错误消息,即Dao类必须用@Dao注释。但正如你在编码片段中看到的那样,Dao类用@Dao注释。有谁知道问题或我的错误可能在哪里?两个文件都不在同一个文件夹中(DAO在服务文件夹中,而另一个类在模型文件夹中)

Device.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);
}

DeviceDAO.java

{{1}}

9 个答案:

答案 0 :(得分:17)

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

不正确的

public abstract Device deviceDao();

正确

public abstract DeviceDAO deviceDao();

希望这会奏效。感谢

答案 1 :(得分:6)

错误讯息: 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 模型类, MyImageDao Dao 类。 因此需要将AppDatabase.java类和 MyImage 修改为 MyImageDao

更正的代码为 -

<强> AppDatabase.java

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

答案 2 :(得分: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>
}

答案 3 :(得分:0)

根据我的判断,您的语法看起来是正确的。你有没有尝试过以下的事情:

  1. 您的导入是否完整?

    import android.arch.persistence.room.Dao; import android.arch.persistence.room.Delete; import android.arch.persistence.room.Insert; import android.arch.persistence.room.OnConflictStrategy; import android.arch.persistence.room.Query; import android.arch.persistence.room.Update;

  2. Mabe删除所有重新导入。

    1. 你重建/ Gradel构建项目吗?
    2. 我也做了一个带房间的项目,我没有遇到同样语法的问题。

答案 4 :(得分: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模块应用程序上方,因为注释处理程序将导致另一个错误,例如database_impl。

然后您应该清理并构建项目

希望它可以帮助任何看到此内容的人

答案 5 :(得分:0)

对于Kotlin用户:

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

  

抽象val myDatabaseDao:MyDatabaseDao

答案 6 :(得分:0)

添加

import androidx.room.Dao;

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

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

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

答案 7 :(得分: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,而DB希望它是可以实现的抽象Dao

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

答案 8 :(得分:0)

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