无法find填充字段 – 使用Kotlin与房间数据库

我正在与Room持久性库集成。 我在Kotlin有一个数据类:

@Entity(tableName = "story") data class Story ( @PrimaryKey val id: Long, val by: String, val descendants: Int, val score: Int, val time: Long, val title: String, val type: String, val url: String ) 

@Entity@PrimaryKey注释用于Room库。 当我尝试构建时,错误是失败的:

 Error:Cannot find setter for field. Error:Execution failed for task ':app:compileDebugJavaWithJavac'. > Compilation failed; see the compiler error output for details. 

我也尝试提供一个默认的构造函数:

 @Entity(tableName = "story") data class Story ( @PrimaryKey val id: Long, val by: String, val descendants: Int, val score: Int, val time: Long, val title: String, val type: String, val url: String ) { constructor() : this(0, "", 0, 0, 0, "", "", "") } 

但是这不起作用。 需要注意的是,如果我把这个Kotlin类转换成一个带有getter和setter的Java类,它就可以工作。 任何帮助表示赞赏!

由于你的领域用val标记,他们是有效的,没有setter字段。

试着用var切换val 。 您可能还需要初始化这些字段。

 @Entity(tableName = "story") data class Story ( @PrimaryKey var id: Long? = null, var by: String = "", var descendants: Int = 0, var score: Int = 0, var time: Long = 0L, var title: String = "", var type: String = "", var url: String = "" ) 

另一个原因可能是该领域的命名。 如果您使用任何预定义的关键字,则会得到相同的错误。 例如,您不能将您的列命名为“is_active”。

参考: http : //www.sqlite.org/lang_keywords.html

在Java中有这个错误。 您必须在构造函数中传递该字段并使用构造函数参数初始化该字段,或者为其创建一个setter。

例:

 public MyEntity(String name, ...) { this.name = name; ... } public void setName(String name) { this.name = name; } 

嘿,我不知道大家是否知道,但你不能有从开始的列is进入Room 。 例如,你不能有这样的

  @Entity(tableName = "user") data class User ( @PrimaryKey var id: Long? = null, var userName: String = "", var isConnectedToFB: Boolean = false, )