error: Entity class must be annotated with @Entity
error: Entity class must be annotated with @Entity
我决定将 kotlin 与 Room 库一起使用,我确实遇到了很多问题,并且厌倦了阅读参考资料和寻找解决方案
我的数据 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
)
我的道 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)
}
数据库Class:
@Database(entities = arrayOf(QueuedSong::class, HistorySongDao::class), version = 2)
abstract class AppDataBase : RoomDatabase() {
abstract fun queuedSongDao(): QueuedSongDao
abstract fun historySongDao(): HistorySongDao
}
QueuedSong 运行良好,但 historySong 中的问题是:
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()
和:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:kaptDebugKotlin'.
> Compilation error. See log for more details
我真的找不到解决办法..
提前致谢
如第一条评论所述,您尝试插入和删除 HistorySongDao 对象而不是 HistorySong,您的代码将变为:
@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)
}
更新数据库Class为此
@Database(entities = arrayOf(QueuedSong::class, HistorySong::class), version = 2)
abstract class AppDataBase : RoomDatabase() {
abstract fun queuedSongDao(): QueuedSongDao
abstract fun historySongDao(): HistorySongDao
}
我把HistorySongDao.class改成了HistorySong.class
我通过更改我的@Database 的参数 (RoomDatabase class) 解决了它,我没有意识到并将我的 DAO 放在我的实体应该在哪里。
就我而言:
@Database(entities = [WordDao::class],version = 1)
更改为:
@Database(entities = [WordEntity::class],version = 1)
因此,当有人遇到此错误时,也许不仅应该检查实体的声明位置,还应该检查实体的使用位置。
对我来说这是一个不同的问题:[ 而不是 {
我输入:
@Database(entities = [Sensor.class, Meter.class],version = 2)
而不是:
@Database(entities ={Sensor.class, Meter.class}, version = 2)
您在数据库 class 中弄错了实体。
也许你正在调用 Dao Interface 而不是 Entity class.
我决定将 kotlin 与 Room 库一起使用,我确实遇到了很多问题,并且厌倦了阅读参考资料和寻找解决方案 我的数据 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
)
我的道 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)
}
数据库Class:
@Database(entities = arrayOf(QueuedSong::class, HistorySongDao::class), version = 2)
abstract class AppDataBase : RoomDatabase() {
abstract fun queuedSongDao(): QueuedSongDao
abstract fun historySongDao(): HistorySongDao
}
QueuedSong 运行良好,但 historySong 中的问题是:
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()
和:
FAILURE: Build failed with an exception.
* What went wrong:
Execution failed for task ':app:kaptDebugKotlin'.
> Compilation error. See log for more details
我真的找不到解决办法.. 提前致谢
如第一条评论所述,您尝试插入和删除 HistorySongDao 对象而不是 HistorySong,您的代码将变为:
@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)
}
更新数据库Class为此
@Database(entities = arrayOf(QueuedSong::class, HistorySong::class), version = 2)
abstract class AppDataBase : RoomDatabase() {
abstract fun queuedSongDao(): QueuedSongDao
abstract fun historySongDao(): HistorySongDao
}
我把HistorySongDao.class改成了HistorySong.class
我通过更改我的@Database 的参数 (RoomDatabase class) 解决了它,我没有意识到并将我的 DAO 放在我的实体应该在哪里。
就我而言:
@Database(entities = [WordDao::class],version = 1)
更改为:
@Database(entities = [WordEntity::class],version = 1)
因此,当有人遇到此错误时,也许不仅应该检查实体的声明位置,还应该检查实体的使用位置。
对我来说这是一个不同的问题:[ 而不是 {
我输入:
@Database(entities = [Sensor.class, Meter.class],version = 2)
而不是:
@Database(entities ={Sensor.class, Meter.class}, version = 2)
您在数据库 class 中弄错了实体。 也许你正在调用 Dao Interface 而不是 Entity class.