无法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, )