कोर डेटा प्राथमिक कुंजी


81

यह बेवकूफी भरा लग सकता है, लेकिन मैं अभी भी यह पता नहीं लगा सका कि xcdatamodel फ़ाइल में प्राथमिक कुंजी के रूप में एक विशेषता को कैसे चिह्नित किया जाए। मेरा लगातार भंडारण sqlite फ़ाइल है। क्या कोई मेरी मदद कर सकता है?

उस स्थिति में, मैं विशिष्ट होने के लिए आईडी को कैसे "मान्य" कर सकता हूं? क्या मुझे एक सत्यापन विधि या कुछ और लिखना चाहिए?

जवाबों:


92

आपके विकल्प हैं:

  • का उपयोग करें -[NSManagedObject objectID]। ध्यान दें कि यह आईडी तब तक अस्थायी है जब तक या तो ऑब्जेक्ट पहली बार सहेजा जाता है या आप कॉल करते हैं-[NSManagedObjectContext obtainPermanentIDsForObjects:error:]
  • CFUUIDअपनी -awakeFromInsertविधि में प्रत्येक ऑब्जेक्ट के लिए UUID बनाने के लिए फ़ंक्शन के परिवार का उपयोग करें
  • अपनी खुद की प्राथमिक कुंजी जैसी प्रणाली बनाएं जो आपके मॉडल में एक पूर्णांक संग्रहीत करता है और प्रत्येक वस्तु के निर्माण के साथ इसे बढ़ाता है

यह प्रमाणित करने का कोई अच्छा तरीका नहीं है कि एक संपत्ति अद्वितीय है। निकटतम समय आपको यह सुनिश्चित करने के लिए है कि यह सृजन के समय में अद्वितीय है, और फिर एक कस्टम सेटर विधि लागू करें जो किसी को भी आईडी बदलने से रोकती है।


5
बहुत अधिक रचनात्मक उत्तर - आपको समाधान के रूप में चिह्नित किया जाना चाहिए!
ग्रौचेल

1
UUID उत्पन्न करना सबसे अच्छा तरीका है। हम इसे अपने ऐप में इस्तेमाल कर रहे हैं और यह बहुत अच्छी तरह से काम कर रहा है।
object2.0

46

ध्यान रखें कि कोर डेटा एक ऑब्जेक्ट-ग्राफ दृढ़ता फ्रेमवर्क है, न कि डेटाबेस। प्राथमिक कुंजी जैसी चीजें दूर हैं क्योंकि वे लगातार स्टोर के कार्यान्वयन पर निर्भर करती हैं।


2
यह उत्तर होना चाहिए था उत्तर @Mugunth चुना जाना चाहिए था! आपके निरीक्षण के लिए धन्यवाद।
लियोनार्ड

तो क्या कोर डेटा सिर्फ अपने दम पर प्राथमिक कुंजी उत्पन्न करेगा?
अगला डेवलपर

24

कोर डेटा अपनी प्राथमिक कुंजी बनाता है - आपको एक जोड़ना नहीं है। आप इसे पुनः प्राप्त कर सकते हैं

NSManagedObjectID *moID = [managedObject objectID];

14

कभी-कभी हैकिंग के दौरान प्राथमिक कुंजी के वास्तविक इंट की आवश्यकता होती है। यहां बताया गया है कि कोई इसे कैसे पकड़ सकता है:

NSManagedObjectID *yourManagedObjectID = [yourManagedObject objectID];
int yourManagedObject_PK = [[[[[yourManagedObjectID URIRepresentation] absoluteString] lastPathComponent] substringFromIndex:1] intValue];

CoreData ऑब्जेक्ट ग्राफ होने के बावजूद, यदि कोई CoreData उत्पन्न SQLite डेटाबेस डेटा को देखता है, तो NSManagedObject की प्राथमिक कुंजी को हथियाने का यह तरीका कोई समस्या नहीं होनी चाहिए। ii ने एक ही कोड में CoreData और निम्न स्तर की sqlite3 C लाइब्रेरी का एक साथ उपयोग किया है और रिकॉर्ड प्राप्त करने के लिए CoreData से sqlite3 तक प्राथमिक कुंजी पास करना ठीक काम करता है।

! यदि आप उत्पादन में इस कोड का उपयोग करने का इरादा रखते हैं, तो dB प्राथमिक कुंजी को URIRepresentation में बदलने के संभावित आंतरिक परिवर्तनों से अवगत रहें, इससे आपका कोड टूट सकता है।

का आनंद लें


1
ऑब्जेक्ट-आईडी और SQLite RID के बीच कोई संबंध निर्धारित नहीं है। केवल विशिष्ट संस्करण के लिए अस्थायी कुंजी के लिए उपयोग करने योग्य हो सकता है, लेकिन लगातार प्राथमिक कुंजी के लिए गलत दृष्टिकोण क्योंकि यह अन्य संस्करण में चुपचाप तोड़ा जा सकता है।
eonil

"दूसरे संस्करण में टूटे" से आपका वास्तव में क्या मतलब है? प्राथमिक कुंजियाँ क्यों बदलनी चाहिए?
मंटू

PK मानों को बदला नहीं जाएगा, लेकिन URL प्रतिनिधित्व करने वाले एल्गोरिथ्म को बदला जा सकता है, क्योंकि कोई भी एल्गोरिथम आधिकारिक रूप से परिभाषित नहीं है। और उस स्थिति में आपका कोड मान्य PK मान निकालने की गारंटी नहीं है। (यदि आपके पास कोई स्रोत एल्गोरिथ्म को परिभाषित करता है, तो मुझे बताएं, फिर मैं आपको पोस्ट करने की सिफारिश करूंगा)
eonil

1
ठीक। कभी-कभी जब हैकिंग पार्ट अजेय होता है। मेरा डाउन-वोट वर्तमान में लॉक-इन है, इसलिए आप कुछ संपादन करें मैं डाउन-वोट को हटा दूंगा।
eonil

2
गति और प्रभावशीलता के लिए, sql कभी-कभी जाने का रास्ता होता है। मेरी छूट, एक क्वेरी होल्ड काउंट (*), रकम, औसत और समूह। OO में इसका एक PAIN है, जो sql के लिए सिंगल लाइन है! यह 'हैक' पूरी तरह से काम करता है और अगर Apple इसे बदल देता है, तो ठीक है कि उन्हें अभी भी sql को किसी तरह काम में शामिल करना होगा, इसलिए मुझे लगता है कि हम थोड़ी देर के लिए ठीक हैं;)। उत्तर प्रदेश को वोट दें, भले ही सैद्धांतिक रूप से हमें ऐसा नहीं करना चाहिए। पूरी तरह से डीबी को छिपाना, मेरी राय में, वास्तविक तकनीकी कारणों की तुलना में सिद्धांतों द्वारा संचालित एक त्रुटि है। हम ऐसा करते हैं, SQL द्वारा बैच प्राप्त करते हैं। हर समय कई अन्य प्रणालियों में भले ही एक रूपरेखा उपलब्ध हो।
एरिक गिगुएरे

0

NSManagedObjectID को हैक किए बिना आप अपने दूरस्थ डेटा संग्रह को प्रबंधित करने से पहले अपनी विशेषता के लिए एक तेज़ जाँच कर सकते हैं।

मैंने एक उपयोगिता विधि बनाई है, इसे यहां जांचें


0

प्राथमिक कुंजी को पुनः प्राप्त करने के लिए एक स्विफ्ट एक्सटेंशन

extension NSManagedObject {
    var primaryKey : String {
        guard objectID.uriRepresentation().lastPathComponent.count > 1 else { return "" }
        return objectID.uriRepresentation().lastPathComponent.substring(from: 1)
    }
}

और स्ट्रिंग के लिए

extension String
{
    func substring(from : Int) -> String {
        guard self.count > from else { return "" }
        return String(self[self.index(self.startIndex, offsetBy: from)...])
     }
}

-3

मैं यूनिक आइडेंटिफायर के रूप में टाइम + क्लास के नाम का उपयोग करना चाहूंगा।


2
वास्तव में अनुशंसित नहीं है, जब आप गारंटी दे सकते हैं कि एक ही समय में एक से अधिक वस्तु नहीं बनाई गई है?
fat32

अनुशंसित भी नहीं। यह विधि कुंजी की गारंटी नहीं दे सकती अद्वितीय है।
कोडी

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