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

मुझे यह त्रुटि थी क्योंकि कोटलिन स्पष्ट रूप से डिफ़ॉल्ट तर्क मानों के साथ एक एकल कोटलिन कन्स्ट्रक्टर के लिए एकाधिक जावा कन्स्ट्रक्टर उत्पन्न करता है। कार्य कोड अगले देखें:

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

क्या हम इस डेटा क्लास के लिए माध्यमिक कन्स्ट्रक्टर बना सकते हैं? –

+0

आप एमानुएल जवाब 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' संपत्ति डीबी को नहीं जोड़ा जाएगा महत्वपूर्ण है, नहीं हो सकता है जो कि व्यक्ति जो सवाल पूछा कि सवाल करने की कोशिश कर रहा है। – Franco

+0

मुझे नहीं पता क्यों, लेकिन यह काम किया। क्या तुम समझा सकते हो? –

0

यहाँ आप अपने अनुप्रयोग डेटाबेस version और पुन: प्रारंभ कार्यक्रम फिर से यह कारगर होगा परिवर्तन:

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

और आप कर सकते हैं

@Entity 
    data class Site(@PrimaryKey(autoGenerate = true) var id: Long) { 
    @Ignore constructor() : this(0) 
    var name: String = "", 
    var url: String = "", 
} 
0123: इस data class कोशिश

और पिछले शिक्षा: अपनी प्राथमिक कुंजी 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 (आईडी = 5) और Testdata के बराबर होती है 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 = "" 
} 

केवल आईडी के लिए ऊपर दिए गए सभी तरीकों उत्पन्न करता है। बराबर का उपयोग करना अवांछित गुणवत्ता की ओर जाता है, जैसा कि 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() 
} 

उपेक्षा आप वास्तव में ध्यान में रखना चाहिए, कि आप आमतौर पर डेटा वर्गों का उपयोग toString और नकल की तरह तरीकों के लिए एक दूसरे निर्माता का उपयोग कर जोड़ना चाहते हैं करने की आवश्यकता है । केवल यह समाधान रनटाइम के दौरान अवांछित बग से बचने के लिए काम कर रहा है।

संबंधित मुद्दे