为什么在向我的 DAO 添加(错误的)Room 数据库查询时出现错误 'Entities and POJOs must have a usable public constructor'?
Why did I get the error 'Entities and POJOs must have a usable public constructor' when adding a (faulty) Room database query to my DAO?
我最近在开发一个 Android 应用程序,运行 在将查询添加到我的 Room 数据库存储库时 运行 出现错误 Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type)
class。
但是,这花了我很长时间才发现,因为据我所知,我在构建时遇到的错误是无关紧要的。在搜索这个问题时,我发现 很多 的答案,其中列出了 'Make sure you annotate your variables with @ColumnInfo' 或 'Move your @Ignore tags to the body of the function' 或 'Make an empty constructor like it says' 之类的东西,但是 [=其中 38=] 个适用于我或解决了问题。
奇怪的是,如果我只是从我的程序中删除这三个查询,我的应用程序 运行 就很好,所以它与构造函数消息没有任何关系。
最终,我注意到我的数据库查询是错误的(请参阅下面代码中的注释)。这比我应该花的时间要长得多,因为我不知道我的查询导致了一个看似无关的构建日志错误。
我主要在这里发布这个问题,以便其他人发现自己处于类似情况时可以找到它(确保您的问题是正确的!!),但我也想知道我是否理解这个错误消息错误,或者它实际上是错误的错误消息。
有人可以向我解释为什么错误的问题会导致出现上述错误消息吗?
包含错误查询的 DAO:
@Dao
interface GameItemDAO {
@Query("SELECT * FROM gameItemTable")
suspend fun getAllGameItems(): List<GameItem>
@Insert
suspend fun insertGameItem(gameItem: GameItem)
@Delete
suspend fun deleteGameItem(gameItem: GameItem)
@Query("DELETE FROM gameItemTable")
suspend fun deleteAllGameItems()
@Query("SELECT * FROM gameItemTable ORDER BY ID DESC LIMIT 1")
suspend fun getLastGameItem(): GameItem?
// These functions were faulty, and should have listed SELECT COUNT (*) FROM...
@Query("SELECT * FROM gameItemTable WHERE OUTCOME=0")
suspend fun getWinCount(): Int
@Query("SELECT * FROM gameItemTable WHERE OUTCOME=1")
suspend fun getLossCount(): Int
@Query("SELECT * FROM gameItemTable WHERE OUTCOME=2")
suspend fun getDrawCount(): Int
}
@实体class:
@Entity(tableName = "gameItemTable")
data class GameItem(
@ColumnInfo(name = "date")
var date: Date,
@ColumnInfo(name = "moveComputer")
var moveComputer: MoveType,
@ColumnInfo(name = "movePlayer")
var movePlayer: MoveType,
@ColumnInfo(name = "outcome")
var outcome: OutcomeType,
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
var id: Long? = null
)
错误信息非常正确。请注意,当查询的 return 类型不是某种类型的 collection/array/list 时,Room 将 return 找到第一个项目,尽管它会在内部检索所有数据,因此它不是依赖于该行为的良好做法。
在你的错误案例中,你要求 Room 获取 * 这意味着它期望 return 一个类型的对象,其属性与 table 的 5 列相匹配。此外,它还需要知道如何构建它,要么使用参数与五列匹配的构造函数,要么使用具有五列设置器的空构造函数。当然,Int不匹配。
我最近在开发一个 Android 应用程序,运行 在将查询添加到我的 Room 数据库存储库时 运行 出现错误 Entities and POJOs must have a usable public constructor. You can have an empty constructor or a constructor whose parameters match the fields (by name and type)
class。
但是,这花了我很长时间才发现,因为据我所知,我在构建时遇到的错误是无关紧要的。在搜索这个问题时,我发现 很多 的答案,其中列出了 'Make sure you annotate your variables with @ColumnInfo' 或 'Move your @Ignore tags to the body of the function' 或 'Make an empty constructor like it says' 之类的东西,但是 [=其中 38=] 个适用于我或解决了问题。
奇怪的是,如果我只是从我的程序中删除这三个查询,我的应用程序 运行 就很好,所以它与构造函数消息没有任何关系。
最终,我注意到我的数据库查询是错误的(请参阅下面代码中的注释)。这比我应该花的时间要长得多,因为我不知道我的查询导致了一个看似无关的构建日志错误。
我主要在这里发布这个问题,以便其他人发现自己处于类似情况时可以找到它(确保您的问题是正确的!!),但我也想知道我是否理解这个错误消息错误,或者它实际上是错误的错误消息。
有人可以向我解释为什么错误的问题会导致出现上述错误消息吗?
包含错误查询的 DAO:
@Dao
interface GameItemDAO {
@Query("SELECT * FROM gameItemTable")
suspend fun getAllGameItems(): List<GameItem>
@Insert
suspend fun insertGameItem(gameItem: GameItem)
@Delete
suspend fun deleteGameItem(gameItem: GameItem)
@Query("DELETE FROM gameItemTable")
suspend fun deleteAllGameItems()
@Query("SELECT * FROM gameItemTable ORDER BY ID DESC LIMIT 1")
suspend fun getLastGameItem(): GameItem?
// These functions were faulty, and should have listed SELECT COUNT (*) FROM...
@Query("SELECT * FROM gameItemTable WHERE OUTCOME=0")
suspend fun getWinCount(): Int
@Query("SELECT * FROM gameItemTable WHERE OUTCOME=1")
suspend fun getLossCount(): Int
@Query("SELECT * FROM gameItemTable WHERE OUTCOME=2")
suspend fun getDrawCount(): Int
}
@实体class:
@Entity(tableName = "gameItemTable")
data class GameItem(
@ColumnInfo(name = "date")
var date: Date,
@ColumnInfo(name = "moveComputer")
var moveComputer: MoveType,
@ColumnInfo(name = "movePlayer")
var movePlayer: MoveType,
@ColumnInfo(name = "outcome")
var outcome: OutcomeType,
@PrimaryKey(autoGenerate = true)
@ColumnInfo(name = "id")
var id: Long? = null
)
错误信息非常正确。请注意,当查询的 return 类型不是某种类型的 collection/array/list 时,Room 将 return 找到第一个项目,尽管它会在内部检索所有数据,因此它不是依赖于该行为的良好做法。
在你的错误案例中,你要求 Room 获取 * 这意味着它期望 return 一个类型的对象,其属性与 table 的 5 列相匹配。此外,它还需要知道如何构建它,要么使用参数与五列匹配的构造函数,要么使用具有五列设置器的空构造函数。当然,Int不匹配。