2017-06-19 82 views

cevap

6

Kotlin, varsayılan argüman değerleri olan tek bir Kotlin yapıcısı için birden fazla Java kurucusu ürettiği için bu hatayı aldım. Çalışma kod sonraki bkz:

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

Bu veri sınıfı için ikincil kurucu yapabilir miyiz? –

+0

Eğer Emanuel yanıtını https://stackoverflow.com/a/46526911/3005202 deneyebilirsiniz –

2

Bu benim için çalıştı:

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

ve şunları yapabilirsiniz:

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

işleri yaparken, 'ignored' mülkiyet DB eklenecektir unutmayın önemlidir, olmayabilir hangi neyi kişi kim soru sormaya çalışıyor sordu. – Franco

+0

Nedenini bilmiyorum ama işe yaradı. Açıklayabilir misin? –

0

Eğer sizin app veritabanı version ve programı tekrar başlatın Agian, işe yarayacak değişir

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

ve son talimat: yöntemi ana anahtar idelle artırılır edilmelidir. sizin için çalışan

Umut. :)

Testi Yukarıdaki cevaplar geçersiz olduğunu göstermek için.

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)}" } 

döner adı seti ile test edin: TestModel (id = 5) ve çalıştıkları ancak hatalara neden olabileceğinden Testdata, yukarıdaki çözümlerden Testdata2 gerçek

+0

Lütfen son virgülü kaldırın ',' ve '@PrimaryKey (autoGenerate = true)' ile, 'id = 0' her zaman ayarlayabilirsiniz. :) – SpkingR

4

Yok iyidir eşittir. Kotlin en Data Class

varsayılan kurucu kullanarak birkaç Yöntemleri üretir. Bu, equals(), hashCode(), ,, componentN() functions ve 'un, kurucunuza atadığınız nitelikler kullanılarak üretildiği anlamına gelir. Yukarıdaki çözüm kullanılarak

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

sadece kimliği için yukarıda listelenen tüm yöntemler oluşturur. Eşit kullanımı, toString() ile aynı istenmeyen kaliteye yol açar. Bu Çözme hepinizin genellikle toString ve kopya gibi yöntemleri var veri sınıflarını kullanan, gerçekten akılda tutmalı

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

gibi görmezden kurucu içinde işlemek ve kullanan ikinci bir yapıcı eklemek istediğiniz nitelikleri olmasını gerektirir . Çalışma zamanında istenmeyen hataları önlemek için yalnızca bu çözüm çalışıyor.