私は Room データベースオブジェクトマッピングライブラリを探索していて、何か奇妙なことを考えました。
this の回答が示すように、エンティティデータモデルは不変のプロパティを持つことはできません。
しかし、私はチェックアウトしました kotlinを使用したgoogleの永続的な例 、Room
は不変のプロパティでも機能します。例の this データクラスを確認してください。
この動作の理由は何でしょうか?
これは、不変の値(val
プロパティ)を作成できる場合に優れた機能になる可能性があります。これにより、オブジェクトの作成後にプログラマーがIDなどの一意の識別子を変更できないようになります。
すべてのフィールドにval
を使用して、問題なくEntityクラスを作成できるので奇妙です。
@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?
)
この問題は、コンストラクターパラメーターにできない特定のフィールドに起因すると思います。 @Relation
アノテーションのJavadocから:
@Relation
アノテーション付きフィールドはコンストラクターパラメーターにすることはできず、パブリックであるか、パブリックセッターを持っている必要があることに注意してください。
回避策として、プライベートコンストラクターパラメーター_myRelationProperty
とパブリックフィールドがありました。
val myRelationProperty: List<MyThings> get() = _myRelationProperty