2017-06-19 23 views
6

適しエラーであるため、コンストラクタを選ぶが、コンパイル時にこのエラーをキャッチすることはできません。ルームには、複数のコンストラクタは、私は私のアンドロイドkotlinプロジェクトで永続的なライブラリを実装しよう

error: Room cannot pick a constructor since multiple constructors are suitable. Try to annotate unwanted constructors with @Ignore.

エラーコード:

@Entity 
data class Site(
     var name: String = "", 
     var url: String = "", 
     @PrimaryKey(autoGenerate = true) var id: Long = 0) 

答えて

6

Kotlinは、デフォルトの引数値を持つ単一のKotlinコンストラクタに対して複数のJavaコンストラクタを生成するため、このエラーが発生しました。あなたができる

@Database(entities = arrayOf(Site::class), version = 123) abstract class YourAppDatabase : RoomDatabase() { 
    abstract fun yourDao(): YourDao 
} 

と:

@Entity 
data class Site(
     var name: String, 
     var url: String, 
     @PrimaryKey(autoGenerate = true) var id: Long) 
+0

このデータクラスの2次コンストラクタを作成できますか? –

+0

あなたはEmanuelの答えを試すことができますhttps://stackoverflow.com/a/46526911/3005202 –

2

これは私の仕事::ここで

@Entity 
data class Site(
    @PrimaryKey(autoGenerate = true) var id: Long = 0), 
    var name: String = "", 
    var url: String = "", 
    @Ignore var ignored: String? = null 
) 
+0

これが機能する間、 'ignored'プロパティはDBに追加されないことに注意することが重要です。疑問を尋ねることを試みている。 – Franco

+0

私はなぜそれが働いたのか分かりません。説明できますか? –

0

を、あなたのアプリのデータベースversionを変更し、プログラムagianを再起動し、それが動作します次の参照コードを作業します試してみてくださいdata class

@Entity 
    data class Site(@PrimaryKey(autoGenerate = true) var id: Long) { 
    @Ignore constructor() : this(0) 
    var name: String = "", 
    var url: String = "", 
} 

と最後の命令:プライマリキーidは、を手動で増やす必要があります

希望はあなたのために働く。 :)

上記の回答が無効であることを示すテスト。

data class TestModel(var id: Int = 0) { 
    constructor() : this(0) 

    var name: String = "defaultname" 
    var testData: String = "defaulttestData" 
} 

val testModel = TestModel(5) 
testModel.name = "test" 

val testModel2 = TestModel(5) 
testModel2.testData = "testdata" 
testModel2.name = "test" 

info { "Test with name set: $testModel" } 
info { "Testdata equals Testdata2 ${testModel.equals(testModel2)}" } 

戻り、名前セットを有する試験:TestModel(ID = 5)、その動作が、エラーを引き起こす可能性があるためテストデータは、上記溶液のTestdata2真

+0

最後のカンマ '、'を削除してください。この設定で '@PrimaryKey(autoGenerate = true)'を指定すると、いつでも 'id = 0'を設定できます。 :) – SpkingR

4

いずれも良好ではないに等しいです。

KotlinのData Classは、デフォルトのコンストラクタを使用していくつかのメソッドを生成します。つまり、コンストラクタに割り当てた属性を使用してequals(),hashCode(), toString(),componentN() functionsおよびcopy()が生成されます。

@Entity data class Site(@PrimaryKey(autoGenerate = true) var id: Long) { 
    @Ignore constructor() : this(0) 
    var name: String = "" 
    var url: String = "" 
} 

のみIDのすべての上記の方法を生成するような上記の溶液を使用し

。 equalsを使用すると、toString()と同じように、望ましくない品質が発生します。これを解決することは、すべてはあなたが通常のtoStringとコピーのようなメソッドを持っているデータクラスを使用することを、あなたは本当に心に留めておく必要があります

@Entity data class Site(
    @NonNull @PrimaryKey(autoGenerate = true) var id: Long, 
    var name: String = "", 
    var url: String = "") { 
    @Ignore constructor(id = 0, name = ", url = "") : this() 
} 

のように無視し、コンストラクタ内で処理して、使用して2番目のコンストラクタを追加したい属性を持つことが必要です。このソリューションは、実行時に望ましくないバグを避けるために働いています。

関連する問題