2017-05-27 10 views
14

私はRoomパーシスタンスライブラリと統合しています。フィールド用セッターが見つかりません - Kotlin with Roomデータベースを使用

@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注釈が館内ライブラリーのためのものです:私のような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 
) { 
    constructor() : this(0, "", 0, 0, 0, "", "", "") 
} 

しかし、これは同様に動作しません:

Error:Cannot find setter for field. 
Error:Execution failed for task ':app:compileDebugJavaWithJavac'. 
> Compilation failed; see the compiler error output for details. 

私はまた、デフォルトコンストラクタを提供しようとしました。注意すべき点は、このKotlinクラスをgetterとsetterを持つJavaクラスに変換すると動作することです。どんな助けもありがとう!

+1

ようにすることはできません。例えば /android/observability/persistence/User.kt Googleの例から、不変プロパティは問題なく動作します。誰かが原因を分析できますか?それはバグでしょうか? –

答えて

48

あなたのフィールドはvalとマークされているため、実質的に最終的であり、セッターフィールドはありません。

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 = "" 
) 
+2

くそー!良いキャッチ:) – Nerd

+0

ねえ、これについて奇妙な何かを考え出した、あなたはそれを見てみることができますか? https://stackoverflow.com/q/47323883/4620609 –

1

この原因のもう1つは、フィールドの名前が付けられている可能性があります。あらかじめ定義されたキーワードを使用すると、同じエラーが発生します。 たとえば、カラムに「is_active」という名前を付けることはできません。

参考:http://www.sqlite.org/lang_keywords.html

1

は、Javaでこのエラーが発生しました。コンストラクタでフィールドを渡して、コンストラクタ引数でフィールドを初期化するか、またはそのコンストラクタを作成する必要があります。

例:

public MyEntity(String name, ...) { 
    this.name = name; 
    ... 
} 

public void setName(String name) { 
    this.name = name; 
} 
1

ねえ、誰もが知っているか、いない場合、私は知りませんが、あなたがRoomisから開始された列を持つことはできません。あなたはhttps://github.com/googlesamples/android-architecture-components/blob/master/BasicRxJavaSampleKotlin/app/src/main/java/com/exampleではこの

@Entity(tableName = "user") 
    data class User (
     @PrimaryKey var id: Long? = null, 
     var userName: String = "", 
     var isConnectedToFB: Boolean = false, 
) 
+1

私の人、あなたは私にデバッグの日々を救った。 – legalimpurity

関連する問題