Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

error: Entity class must be annotated with @Entity

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

like image 899
Mohamed Saber Avatar asked Feb 01 '18 17:02

Mohamed Saber


People also ask

What is @entity annotation in spring boot?

The @Entity annotation specifies that the class is an entity and is mapped to a database table. The @Table annotation specifies the name of the database table to be used for mapping.

What is an entity class in android?

android.arch.persistence.room.Entity. Marks a class as an entity. This class will have a mapping SQLite table in the database. Each entity must have at least 1 field annotated with PrimaryKey . You can also use primaryKeys() attribute to define the primary key.


2 Answers

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)
}
like image 24
Moncef AOUDIA Avatar answered Sep 19 '22 09:09

Moncef AOUDIA


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.

like image 100
felipe Avatar answered Sep 22 '22 09:09

felipe