कमरे की दृढ़ता के लिए प्राथमिक कुंजी को आत्मकेंद्रित कैसे बनाया जाए


194

मैं एक इकाई (रूम परसिस्टेंस लिब) क्लास फूड बना रहा हूं, जहां मैं foodIdआटोइनरेमेन्ट बनाना चाहता हूं ।

@Entity
class Food(var foodName: String, var foodDesc: String, var protein: Double, var carbs: Double, var fat: Double)
{
    @PrimaryKey
    var foodId: Int = 0
    var calories: Double = 0.toDouble()
}

मैं foodIdएक स्वदेशी क्षेत्र कैसे सेट कर सकता हूं ?


4
इसके बजाय 0.toDouble()आप का उपयोग 0.0कर इसे एक डबल के रूप में घोषित कर सकते हैं
RobCo

2
आप फूड क्लास का एक नया उदाहरण कैसे बना सकते हैं? क्या आप मैन्युअल आईडी निर्दिष्ट करते हैं या आप इसे खाली छोड़ देते हैं?
ज़ूकी

2
भविष्य के पाठकों के लिए एक नोट - कक्ष के लिए प्राथमिक कुंजी 0 होनी चाहिए ताकि इसे परेशान न किया जा सके। यदि आप किसी अन्य डिफ़ॉल्ट मान (जैसे -1) का उपयोग करते हैं, तो कक्ष आईडी को ऑटोजेनरेट नहीं करेगा।
मार्टिन मेल्का

जवाबों:


374

आपको autoGenerateसंपत्ति का उपयोग करने की आवश्यकता है

आपकी प्राथमिक कुंजी एनोटेशन इस तरह होनी चाहिए:

@PrimaryKey(autoGenerate = true)

प्राथमिक के लिए संदर्भ ।


3
धन्यवाद, मैं स्वतः खोज के लिए खोज कर रहा था, यही कारण है कि खोजने में सक्षम नहीं था।
chandil03

अगर @ मैं एक मेज में दो प्राथमिक कुंजी (समग्र प्राथमिक कुंजी) चाहता हूं और प्राथमिक कुंजी में से एक को ऑटो वेतन वृद्धि होना चाहिए तो क्या होगा? मैं उसे कैसे प्राप्त कर सकता हूं? क्या आप इसका जवाब यहां दे सकते हैं ?
प्रियंका अलचिया

1
@MatPeg अगर मैं चाहता हूं कि एक प्राथमिक हो तो वह स्वयं उत्पन्न होता है, और एक जो REST से आता है @Entity( primaryKeys = arrayOf(COLUMN_ID_LOCAL,COLUMN_ID_REMOTE))?
murt

@ आपको एक प्राथमिक प्राथमिक कुंजी की आवश्यकता है, लेकिन आप वह नहीं कर सकते जो आप प्राप्त करना चाहते हैं। पढ़ें यहाँ
MatPag

लिंक किए गए दस्तावेज़ का महत्वपूर्ण हिस्सा:Insert methods treat 0 as not-set while inserting the item.
मीका

123

आप @PrimaryKey(autoGenerate = true)इस तरह जोड़ सकते हैं :

@Entity
data class Food(
        var foodName: String, 
        var foodDesc: String, 
        var protein: Double, 
        var carbs: Double, 
        var fat: Double
){
    @PrimaryKey(autoGenerate = true)
    var foodId: Int = 0 // or foodId: Int? = null
    var calories: Double = 0.toDouble()
}

34
foodIdशून्य होने की जरूरत नहीं है (लेकिन यह हो सकता है)। कोई भी डिफ़ॉल्ट मानों का उपयोग कर सकता है। var foodId: Int = 0और ऑटोजेनरेट ठीक से काम करेगा।
मिशेल बरन

8
@ माइकेलबरन, जावा डॉक से, जब प्रकार एक आदिम जावा है intया long, 0 को अशक्त के रूप में माना जाता है, जब प्रकार पूर्णांक या लंबा है, अशक्त अशक्त है। चूंकि कोटलिन इंट जब जेवीएम में गैर-अशक्त काम करता है आदिम इंट के रूप में, तो आप सही हैं और var foodId: Int = 0काम करेंगे, लेकिन var foodId: Int? = 0इंट के बाद से काम नहीं करेगा? जेवीएम में पूर्णांक के रूप में परिवर्तित किया गया है। @ जेएमके, अगर आप इसे 0 करते हैं, तो आपको intउपरोक्त कारण के लिए एक गैर-अशक्त बनाना होगा ।
एलन वेलोसो

2
आप बिना दूसरे तरीके से लिख सकते हैं: val jack = User(name = "Jack", phone= 1)इस मामले में आप कंस्ट्रक्टर से 0 हटा सकते हैं
user7856586

1
इस दृष्टिकोण के साथ मुझे जो समस्या दिख रही है, वह डेटा वर्ग के रूप में है। जब खाद्य एक डेटा वर्ग (जैसे स्निपेट में) होता है, तो भोजन का उपयोग बराबरी () तुलना के लिए किया जाता है, इसलिए विभिन्न खाद्य पदार्थों के साथ दो खाद्य पदार्थों को समान माना जा सकता है। डिफ़ॉल्ट मानों के साथ नामित तर्कों का उपयोग करने से समस्या हल हो जाएगी।
सोती

1
@AllanVeloso क्या आप बता सकते हैं कि foodIdशरीर में क्यों रखा गया और निर्माणकर्ता में नहीं?
नीरज सेवानी

42

जोड़ना @PrimaryKey(autoGenerate = true)

@Entity
public class User {

    @PrimaryKey(autoGenerate = true)
    private int id;

    @ColumnInfo(name = "full_name")
    private String name;

    @ColumnInfo(name = "phone")
    private String phone;

    public User(){
    }

    //type-1
    public User(String name, String phone) {
        this.name = name;
        this.phone = phone;
    }

    //type-2
    public User(int id, String name, String phone) {
        this.id = id;
        this.name = name;
        this.phone = phone;
    }

}

डेटा संग्रहीत करते समय

 //type-1
 db.userDao().InsertAll(new User(sName,sPhone)); 

 //type-2
 db.userDao().InsertAll(new User(0,sName,sPhone)); 

श्रेणी 1

यदि आप प्राथमिक कुंजी के लिए मान नहीं दे रहे हैं, तो डिफ़ॉल्ट रूप से यह 0 या शून्य होगा।

टाइप -2

ऑब्जेक्ट बनाते समय आईडी के लिए शून्य या शून्य रखें (मेरा केस यूजर ऑब्जेक्ट)

यदि फ़ील्ड प्रकार लंबा या int है (या इसके TypeConverter इसे एक लंबा या int में कनवर्ट करता है), तो आइटम सम्मिलित करते समय विधियों को 0 के रूप में सेट-सेट नहीं माना जाता है।

यदि फ़ील्ड का प्रकार Integer या Long (Object) है (या इसका TypeConverter इसे Integer या Long) में परिवर्तित करता है, तो इन्सर्ट मेथड्स आइटम सम्मिलित करते समय शून्य के रूप में नहीं-सेट के रूप में व्यवहार करते हैं।


1
क्या हम कस्टम आईडी को इकाई में पास कर सकते हैं, भले ही यह ऑटो-जेनरेट करने के लिए सेट हो?
इगोरगानापोलस्की

2
@ आईओआर गणपकोल्स्की हां, लेकिन प्रवेश उस कस्टम आईडी के साथ जनरेट करेगा [ऑटो-इन्क्रिमेंट काम नहीं करेगा] और यदि आप उसी आईडी को फिर से पास करते हैं तो यह 'यूएनआईईकेई बाधा विफल' हो जाएगा, इसलिए आपको पास की जरूरत है और हमेशा नई आईडी बनानी चाहिए [0 या null] और ऑटो-इंक्रीमेंट को आपके लिए यह काम करने दें।
कुणाल खेडकर

3
यदि आप ऑटोजेनरेट करना चाहते हैं तो आप उपयोगकर्ता को कंस्ट्रक्टर में आईडी क्यों डाल रहे हैं?
हेलकास्ट

कोटलिन में आप डेटा क्लास का उपयोग कर सकते हैं और लिख सकते हैं: val jack = User(name = "Jack", phone= 1)इस मामले में आप कंस्ट्रक्टर से 0 हटा सकते हैं
user7856586

@hellcast यदि आप कंस्ट्रक्टर में id शामिल नहीं करते हैं (जैसा कि मैंने अभी कठिन तरीका सीखा है) जब आप DB को क्वेरी करते हैं तो वह id फ़ील्ड को असाइन नहीं करेगा (यह आपको कंस्ट्रक्टर में इसके साथ इनिशियलाइज़ करेगा) मुझे लगता है कि यह उसी कंस्ट्रक्टर को कहता है जब ऑब्जेक्ट के फ़ील्ड्स को पॉप्युलेट करता है।
अली हिरानी

6
@Entity(tableName = "user")
data class User(

@PrimaryKey(autoGenerate = true)  var id: Int?,
       var name: String,
       var dob: String,
       var address: String,
       var gender: String
)
{
    constructor():this(null,
        "","","","")
}

4
हालांकि यह कोड स्निपेट समाधान हो सकता है, जिसमें स्पष्टीकरण भी शामिल है , जो आपके पोस्ट की गुणवत्ता को बेहतर बनाने में मदद करता है। याद रखें कि आप भविष्य में पाठकों के लिए प्रश्न का उत्तर दे रहे हैं, और उन लोगों को आपके कोड सुझाव के कारणों का पता नहीं चल सकता है।
जोहान

4
"उपयोग @PrimaryKey(autoGenerate = true)" जैसे कई उत्तर हैं - क्या आपका जवाब इस धागे में कुछ नया जोड़ता है?
बार्बसन

हाँ, यह जोड़ता है - यह प्रस्तुत करता है कि अशक्त
ऑटोजेनरेटेड

5

उदाहरण के लिए, यदि आपके पास एक usersइकाई है जिसे आप स्टोर करना चाहते हैं, खेतों के साथ (firstname, lastname , email)और आप ऑटोजेनरेटेड आईडी चाहते हैं, तो आप ऐसा करते हैं।

@Entity(tableName = "users")
data class Users(
   @PrimaryKey(autoGenerate = true)
   val id: Long,
   val firstname: String,
   val lastname: String,
   val email: String
)

कमरे के बाद idक्षेत्र को ऑटो-जेनरेशन और ऑटो-इंक्रीमेंट किया जाएगा ।


21
हर बार जब हम एक नया उपयोगकर्ता ऑब्जेक्ट बनाते हैं तो हमें एक आईडी फ़ील्ड पास करनी होगी। क्या इससे बचा जा सकता है?
आदित्य लाडवा

10
हां, @PrimaryKey(autoGenerated = true) val id: Long? = nullकंस्ट्रक्टर के बाहर, कक्षा के शरीर पर
एलन वेलोसो

1
@Magritte अधिक pls विस्तृत करने के लिए देखभाल?
इस्पम

2
@Ispam ऊपर मेरे जवाब में मैंने पोस्ट किया कि पूरी क्लास को कैसा दिखना चाहिए।
एलन वेलोसो

2
दरअसल, आप केवल आईडी के रूप में 0 डाल सकते हैं। यदि आपने @PrimaryKey विकल्प सेट किया है, तो कक्ष स्वचालित रूप से एक आईडी जनरेट करेगा।
रोमेन्सो

1

ऊपर दिए गए कोड के साथ अपनी इकाई को एनोटेट करें।

जावा में

@PrimaryKey(autoGenerate = true)
private int id;

कोटलिन में

@PrimaryKey(autoGenerate = true)
var id: Int;

कमरे के बाद आईडी क्षेत्र को ऑटोजेनरेट और ऑटो-इंक्रीमेंट किया जाएगा।

हमारी साइट का प्रयोग करके, आप स्वीकार करते हैं कि आपने हमारी Cookie Policy और निजता नीति को पढ़ और समझा लिया है।
Licensed under cc by-sa 3.0 with attribution required.