1. ホーム
  2. android

[解決済み] フィールドのセッターが見つからない - KotlinとRoomデータベースを使用した場合

2023-04-02 20:29:55

質問

私はRoom persistence libraryと統合しています。私は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クラスをゲッターとセッターを持つJavaクラスに変換すると動作することです。どんな助けでも感謝します!

どうすれば解決するのでしょうか?

あなたのフィールドには val でマークされているので、それらは事実上finalであり、セッターフィールドを持ちません。

を入れ替えてみてください。 valvar . また、フィールドを初期化する必要があるかもしれません。

@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 = ""
)

EDIT

上記の解決策は、KotlinをHibernateのような他のJavaライブラリと一緒に使用したときにKotlinでこのエラーが発生した場合の一般的な修正方法です。もしあなたがRoomで不変性を維持したいのであれば、あなたのケースにもっと特化した他の答えを参照してください。

Java ライブラリによる不変性がまったく機能しない場合があり、悲しい開発者の声を聞きながら、そのような場合は valvar 残念ながら