web-dev-qa-db-ja.com

RoomエンティティがAndroid)の不変プロパティで機能しない理由

私は Room データベースオブジェクトマッピングライブラリを探索していて、何か奇妙なことを考えました。

this の回答が示すように、エンティティデータモデルは不変のプロパティを持つことはできません。

しかし、私はチェックアウトしました kotlinを使用したgoogleの永続的な例Roomは不変のプロパティでも機能します。例の this データクラスを確認してください。

この動作の理由は何でしょうか?

これは、不変の値(valプロパティ)を作成できる場合に優れた機能になる可能性があります。これにより、オブジェクトの作成後にプログラマーがIDなどの一意の識別子を変更できないようになります。

14
Samuel Robert

すべてのフィールドに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?
)

そして、データはまだデータベース内に正しく保存されています。 enter image description here

3
Khairil Ushan

この問題は、コンストラクターパラメーターにできない特定のフィールドに起因すると思います。 @RelationアノテーションのJavadocから:

@Relationアノテーション付きフィールドはコンストラクターパラメーターにすることはできず、パブリックであるか、パブリックセッターを持っている必要があることに注意してください。

回避策として、プライベートコンストラクターパラメーター_myRelationPropertyとパブリックフィールドがありました。

val myRelationProperty: List<MyThings> get() = _myRelationProperty
1
Mitchell Skaggs