2011-01-18 13 views
36

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

क्या किसी के पास कोई सिफारिश है?

धन्यवाद!

उत्तर

94

-[NSManagedObject objectID] कोर डेटा में किसी ऑब्जेक्ट उदाहरण के लिए अद्वितीय आईडी है। इसे -[NSManagedObjectID URIRepresentation] के माध्यम से क्रमबद्ध किया जा सकता है। आप के साथ एक सतत स्टोर समन्वयक से objectID पुनर्प्राप्त कर सकते हैं और फिर ऑब्जेक्ट को प्रबंधित ऑब्जेक्ट संदर्भ से -[NSManagedObjectContext objectWithID:] के साथ प्राप्त कर सकते हैं।

लेकिन

आप ध्यान रखें कि कोर डाटा नहीं एक ORM है में रखना चाहिए। यह object graph management framework है। यह बैकएंड के रूप में SQLite (और अद्वितीय पंक्ति आईडी) का उपयोग करता है पूरी तरह कार्यान्वयन विवरण है। जितनी जल्दी आप स्वयं को एसक्यूएल/आरडीबीएमएस मानसिकता से बाहर निकाल सकते हैं, तेज़ी से आप कोर डेटा से खुश होंगे। संग्रहीत आईडी से ऑब्जेक्ट खोजने का प्रयास करने के बजाय, इस बात पर विचार करें कि आपको उस ऑब्जेक्ट की आवश्यकता क्यों है और किस ऑब्जेक्ट की आवश्यकता है। वर्ग Foo का एक उदाहरण वर्ग Bar का एक उदाहरण के लिए प्राप्त करने में सक्षम होने की जरूरत है, तो क्यों सिर्फ Bar को Foo से एक संघ बना सकते हैं और उचित Foo उदाहरण पर संघ का लक्ष्य के रूप में उपयुक्त Bar उदाहरण सेट नहीं। कोर डेटा ऑब्जेक्ट आईडी का ट्रैक रखने दें।

+33

मेरी इच्छा है कि मैं आपको 'कोर डेटा डेटाबेस नहीं' के लिए एक और प्लस दे सकता हूं। – Abizern

+5

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

+1

@ माइकल: बिल्कुल। ऐसा करने के लिए सबसे अच्छा अभ्यास क्या है? – Noah

42

बैरी वार्क ने कहा, हमेशा याद रखें कि कोर डेटा एक ओआरएम नहीं है। शुद्ध SQL विवरण उपयोगकर्ता के संपर्क में नहीं आते हैं और प्रत्येक पंक्ति केवल एक वस्तु है। वैसे, आपको कभी-कभी "प्राथमिक कुंजी" तक पहुंचने की आवश्यकता होनी चाहिए, उदाहरण के लिए जब आपको बाहरी एसक्यूएल डेटाबेस के साथ कोर्डाटा डीबी को सिंक करने की आवश्यकता होती है (मेरे मामले में मुझे इसे किसी ऑब्जेक्ट की स्थिति बदलने के लिए कॉलबैक फ़ंक्शन में चाहिए रिमोट डीबी में सफलता के साथ)। इस मामले में, आप का उपयोग कर सकते हैं:

objectId=[[[myCoredataObject objectID] URIRepresentation] absoluteString] 

कि इस तरह की स्ट्रिंग वापस आ जाएगी: एक्स-CoreData: // 76BA122F-0BF5-4D9D-AE3F-BD321271B004/वस्तु/p521 अद्वितीय करने के लिए CoreData द्वारा प्रयोग किया जाता है कि आईडी उस वस्तु की पहचान करें।

आपको लगता है कि विशिष्ट आईडी के साथ एक वस्तु वापस पाने के लिए करना चाहते हैं:

NSManagedObject *managedObject= [managedObjectContext objectWithID:[persistentStoreCoordinator managedObjectIDForURIRepresentation:[NSURL URLWithString:objectId]]]; 

एनबी: याद रखें कि यदि रिसीवर अभी तक CoreData संदर्भ में नहीं सहेज लिया गया है, वस्तु आईडी एक अस्थायी मान जो जाएगा जब ऑब्जेक्ट सहेजा जाता है तो बदलें।

+1

बिल्कुल! एक ही समस्या। रिमोट mySQL में प्रवेश करने के लिए सर्वर को इस आईडी को इकाई विवरण के साथ भेजने की आवश्यकता है और फिर प्रतिक्रिया में, सर्वर को उसी ऑब्जेक्ट आईडी के साथ अद्वितीय आईडी उत्पन्न करें। ऑब्जेक्ट फॉर्म ऑब्जेक्ट प्राप्त करें ID और सर्वर आईडी को इसमें संग्रहीत करें। –

+0

एनईसी स्पष्टीकरण और कोड के लिए धन्यवाद ... मेरी समस्या हल हो गई .. :) –

+0

@donnit, amogh तो मैं ऐसी स्थिति में क्या करूँ जहां मैं सामग्री ऑफसाइट को सहेज रहा हूं, और फिर जब मुझे सर्वर के अंत में पॉप्युलेट करना होगा आईडी के मिलान और मूल्यों को अपडेट करने में सक्षम? और यदि आईडी डेटाबेस में मौजूद नहीं है तो भी एक नई वस्तु जोड़ने में सक्षम हो। तब मैं इसे कैसे पूरा करूं? – Pavan