我一直在探索Room数据库对象映射库,我想到了一些奇怪的东西。
实体数据模型不能具有不可变属性,如this答案所示。
但我检查了google's persistent example with kotlin,Room
也使用了不可变属性。请查看示例中的this数据类。
这种行为可能是什么原因?
如果我们可以创建不可变值(val
属性),这可能是一个很好的功能,因为这会限制程序员在创建对象后更改唯一标识符,例如ids。
答案 0 :(得分:3)
这很奇怪,因为我可以使用val
为我的所有字段制作我的实体课而不会出现问题
@Entity(tableName = "repo")
data class RepoEntity(
@PrimaryKey @ColumnInfo(name = "id") @SerializedName("id") val id: Int,
@ColumnInfo(name = "name") @SerializedName("name") val name: String,
@ColumnInfo(name = "full_name") @SerializedName("full_name") val fullName: String,
@Embedded(prefix = "owner") @SerializedName("owner") val owner: RepoOwnerEntity,
@ColumnInfo(name = "html_url") @SerializedName("html_url") val htmlUrl: String,
@ColumnInfo(name = "description") @SerializedName("description") val description: String?
)
答案 1 :(得分:0)
我认为问题源于某些不能构造函数参数的字段。来自@Relation
注释的Javadoc:
请注意,
@Relation
带注释的字段不能是构造函数参数,它必须是公共的或具有公共setter。
作为一种解决方法,我有一个私有构造函数参数_myRelationProperty
和一个公共字段:
val myRelationProperty: List<MyThings> get() = _myRelationProperty