error: Entity class must be annotated with @Entity

20,042

Solution 1

As it said in the first comment, you are trying to insert and delete HistorySongDao objects instead of HistorySong, your code will become:

@Dao
 interface HistorySongDao {

       @Delete
       fun deleteSong(vararg historySong: HistorySong)

       @Insert(onConflict = OnConflictStrategy.REPLACE)
        fun insert(vararg historySong: HistorySong)

       @Query("SELECT * FROM HistorySong")
        fun loadAllSongs(): Array<HistorySong>

       @Query("SELECT * FROM HistorySong WHERE songId = :mId")
        fun findById(mId: Int): HistorySong

       @Query("SELECT * FROM HistorySong WHERE is_favoutire = :getFavourite ")
        fun getFavourite(getFavourite : Boolean) : Array<HistorySong>

       @Update
       fun updateUsers(vararg historySong: HistorySong)
}

Solution 2

I solved it by changing my @Database's argument (RoomDatabase class), I didn't realize and put my DAO where should be my Entity.

In my case:

@Database(entities = [WordDao::class],version = 1)

changed to:

@Database(entities = [WordEntity::class],version = 1)

So, when somebody gets this error, maybe should to check not only where the entity is declared but too where it is used.

Solution 3

Update Database Class to this

@Database(entities = arrayOf(QueuedSong::class, HistorySong::class), version = 2)
abstract class AppDataBase : RoomDatabase() {
abstract fun queuedSongDao(): QueuedSongDao
abstract fun historySongDao(): HistorySongDao
}

I change HistorySongDao.class to HistorySong.class

Solution 4

You have mistaken in your Database class with entities. Maybe you are calling Dao Interface rather then Entity class.

Solution 5

By me it was a different problem: [ instead of {

I put :

@Database(entities = [Sensor.class, Meter.class],version = 2)

instead of:

@Database(entities ={Sensor.class, Meter.class}, version = 2)
Share:
20,042
Mohamed Saber
Author by

Mohamed Saber

Updated on May 06, 2021

Comments

  • Mohamed Saber
    Mohamed Saber about 3 years

    I decided to use kotlin with Room library and I really faced a lot of problems and tired from reading reference and finding a solution My Data Class:

    @Entity
    data class HistorySong(
            @PrimaryKey
            var SongId: Int =0,
    
            @ColumnInfo(name = "song_name")
            var songName: String="",
    
            @ColumnInfo(name = "song_artist")
            var songArtist: String="",
    
            @ColumnInfo(name = "song_link")
            var songLink: String="",
    
            @ColumnInfo(name = "image_path")
            var songImagePath: String="",
    
            @ColumnInfo(name="is_favoutire")
            var songisFavourite: Boolean= false
    )
    

    My Dao class :

    @Dao
     interface HistorySongDao {
    
           @Delete
           fun deleteSong(historySongDao: HistorySongDao)
    
           @Insert(onConflict = OnConflictStrategy.REPLACE)
            fun insert(vararg historySongDao: HistorySongDao)
    
           @Query("SELECT * FROM HistorySong")
            fun loadAllSongs(): Array<HistorySong>
    
    
           @Query("SELECT * FROM HistorySong WHERE songId = :mId")
            fun findById(mId: Int): HistorySong
    
           @Query("SELECT * FROM HistorySong WHERE is_favoutire = :getFavourite ")
            fun getFavourite(getFavourite : Boolean) : Array<HistorySong>
    
    
    
           @Update
           fun updateUsers(vararg historySong: HistorySong)
    }
    

    Database Class:

    @Database(entities = arrayOf(QueuedSong::class, HistorySongDao::class), version = 2)
    abstract class AppDataBase : RoomDatabase() {
        abstract fun queuedSongDao(): QueuedSongDao
        abstract fun historySongDao(): HistorySongDao
    }
    

    QueuedSong is working great but the problem in historySong is:

    e: F:\SmartStreamer\app\build\tmp\kapt3\stubs\debug\com\pro\smartstreamer\Database\QueuedDatabase\HistorySongDao.java:7: error: Entity class must be annotated with @Entity
    public abstract interface HistorySongDao {
                    ^
    w: F:\SmartStreamer\app\build\tmp\kapt3\stubs\debug\com\pro\smartstreamer\Database\QueuedDatabase\AppDataBase.java:10: warning: Room cannot create an SQLite connection to verify the queries. Query verification will be disabled. Error: [SQLITE_ERROR] SQL error or missing database (near ")": syntax error)
    public abstract class AppDataBase extends android.arch.persistence.room.RoomDatabase {
                    ^
    w: F:\SmartStreamer\app\build\tmp\kapt3\stubs\debug\com\pro\smartstreamer\Database\QueuedDatabase\HistorySong.java:10: warning: There are multiple good constructors and Room will pick the no-arg constructor. You can use the @Ignore annotation to eliminate unwanted constructors.
    public final class HistorySong {
                 ^
    e: F:\SmartStreamer\app\build\tmp\kapt3\stubs\debug\com\pro\smartstreamer\Database\QueuedDatabase\HistorySongDao.java:15: error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.
        com.pro.smartstreamer.Database.QueuedDatabase.HistorySongDao... historySongDao);
                                                                        ^
    e: F:\SmartStreamer\app\build\tmp\kapt3\stubs\debug\com\pro\smartstreamer\Database\QueuedDatabase\HistorySongDao.java:11: error: Type of the parameter must be a class annotated with @Entity or a collection/array of it.
        com.pro.smartstreamer.Database.QueuedDatabase.HistorySongDao historySongDao);
                                                                     ^
    e: F:\SmartStreamer\app\build\tmp\kapt3\stubs\debug\com\pro\smartstreamer\Database\QueuedDatabase\HistorySongDao.java:30: error: com.pro.smartstreamer.Database.QueuedDatabase.HistorySongDao is part of com.pro.smartstreamer.Database.QueuedDatabase.AppDataBase but this entity is not in the database. Maybe you forgot to add com.pro.smartstreamer.Database.QueuedDatabase.HistorySong to the entities section of the @Database?
        public abstract void updateUsers(@org.jetbrains.annotations.NotNull()
    

    and :

    FAILURE: Build failed with an exception.
    
    * What went wrong:
    Execution failed for task ':app:kaptDebugKotlin'.
    > Compilation error. See log for more details
    

    I really can't find a solution.. Thanks in advance