Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/306.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java Android房间错误:Dao类必须用@Dao注释_Java_Android_Database_Android Room - Fatal编程技术网

Java Android房间错误:Dao类必须用@Dao注释

Java Android房间错误:Dao类必须用@Dao注释,java,android,database,android-room,Java,Android,Database,Android Room,我正在使用我的android应用程序的空间。我现在正试图设置我的数据库,但是有一条错误消息,它说Dao类必须用@Dao注释。但是正如您在代码片段中看到的,Dao类是用@Dao注释的。有人知道问题或我的错误在哪里吗?两个文件不在同一文件夹中(DAO在服务文件夹中,而另一个类在模型文件夹中) Device.java @Entity(tableName = "device") public class Device { @PrimaryKey(autoGenerate = true)

我正在使用我的android应用程序的空间。我现在正试图设置我的数据库,但是有一条错误消息,它说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;
    }
}
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
公共接口设备DAO{
@插入(onConflict=OnConflictStrategy.REPLACE)
void addDeviceReferences(困难类型困难类型);
@查询(“从设备中选择*)
列出SelectAllDeviceReferences();
@更新(onConflict=OnConflictStrategy.REPLACE)
void updateDevicePreferences(设备);
}

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

不正确

公共抽象设备deviceDao()

正确的

公共抽象设备dao DeviceDAO()


希望这能奏效。谢谢

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

  • 你们的进口完成了吗

    导入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类必须用@Dao注释

    要解决错误,请正确阅读。

    如果模型类上显示此错误消息,则需要修改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;
        }
    }
    
    @Dao
    public interface MyImageDao {
        @Query("SELECT * FROM myimage")
        List<MyImage> getAll();
    
        @Insert
        void insertAll(MyImage... myImages);
    
        @Delete
        void delete(MyImage myImage);
    }
    
    @Database(entities = {MyImage.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract MyImage myImageDao();
    }
    
    @Database(entities = {MyImage.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract MyImageDao myImageDao();
    }
    
    MyImageDao.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;
        }
    }
    
    @Dao
    public interface MyImageDao {
        @Query("SELECT * FROM myimage")
        List<MyImage> getAll();
    
        @Insert
        void insertAll(MyImage... myImages);
    
        @Delete
        void delete(MyImage myImage);
    }
    
    @Database(entities = {MyImage.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract MyImage myImageDao();
    }
    
    @Database(entities = {MyImage.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract MyImageDao myImageDao();
    }
    
    这里只有AppDatabase.java文件有错误,您可以看到myImageDao有返回类型MyImage,这意味着它假设MyImage是一个Dao类,但是MyImage模型类,myImageDaoDao类。 因此它需要修改AppDatabase.java类和MyImageMyImageDao

    更正后的代码为-

    AppDatabase.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;
        }
    }
    
    @Dao
    public interface MyImageDao {
        @Query("SELECT * FROM myimage")
        List<MyImage> getAll();
    
        @Insert
        void insertAll(MyImage... myImages);
    
        @Delete
        void delete(MyImage myImage);
    }
    
    @Database(entities = {MyImage.class}, version = 1)
    public abstract class AppDatabase extends RoomDatabase {
        public abstract MyImage myImageDao();
    }
    
    @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
        }
    }
    
    @Dao接口设备Dao{
    @获取:查询(“从extdevice选择*)
    val all:列表
    乐趣第一():ExtDevice{
    val设备=所有
    if(devices.isNotEmpty())
    返回设备[0]
    返回空
    }
    }
    
    删除first()解决了我的问题:

    @Dao interface DeviceDao {
        @get:Query("SELECT * FROM extdevice")
        val all: List<ExtDevice>
    }
    
    @Dao接口设备Dao{
    @获取:查询(“从extdevice选择*)
    val all:列表
    }
    
    在我的例子中,我实现了@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而不是annotation processor并添加:

    apply plugin: 'kotlin-kapt'
    
    在build.gradle模块应用程序上方,因为annotationProcessor将导致另一个错误,如database_impl

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

    希望它能帮助那些看到Kotlin用户的这篇文章的人:

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

    抽象val myDatabaseDao:myDatabaseDao

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

    @Dao
    public interface UserDeo {
        @Query("SELECT * FROM user")
        List<User> getAllUsers();
    
        @Insert
        void insertAll(User... users);
    }
    
    
    @Dao
    公共接口UserDeo{
    @查询(“从用户中选择*)
    列出getAllUsers();
    @插入
    void insertAll(用户…用户);
    }
    
    注意,ObjInspectionSqlite是一个带有
    @Entity
    的类,我已经在数据库中声明了它是抽象的

    这将显示:

    “错误:Dao类必须用@Dao注释”

    即使你正确地声明了你的刀

    也许您在数据库中的某个地方将类声明为
    抽象
    ,DB希望它是可以实现的抽象的
    Dao


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

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

    错误消息来自哪里?您的
    RoomDatabase
    子类是否有一个
    abstract
    方法,该方法返回的不是
    DeviceDAO
    ?这是一个接口,不是一个类。我确信我编写的是公共抽象DeviceDAO DeviceDAO();否则它会给我另一条错误消息。但我现在使用的是ObjectBox,它可以正常工作。无论如何,谢谢你的帮助。它们都是进口的,而且已经重新进口了。在这之后,我试图重建我的项目,但也没有成功。但是现在我用ObjectBox而不是Room,它可以工作了。不过,谢谢你的帮助。