2012-05-23 9 views
13

आईट्यून्स पर Stanford 193P आईफोन कोर्स से कोर डेटा व्याख्यान में, प्रशिक्षक ने NSPersistentStoreCoordinator का उपयोग किए बिना कोर डेटा के साथ नमूना प्रोजेक्ट को कोड किया और इसे NSManagedObjectModel के साथ लोड किया। लेकिन आईफोन विकास पर अन्य कोड नमूने और बिग नेर्ड रांच बुक को देखने में, वे NSManagedObjectModel और पर्सिस्टेंटस्टोरकॉर्डिनेटर बना रहे हैं और NSManagedObjectContext इस तरह से स्थापित कर रहे हैं।NSPersistentStoreCoordinator का उपयोग करने का बिंदु?

मेरा प्रश्न यह है कि इसे इस तरह से करने का उद्देश्य क्या है, और दोनों दृष्टिकोणों के पेशेवरों और विपक्ष क्या हैं?

उत्तर

18

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

के रूप में पॉल डेमो से पहले व्याख्यान में बताया गया है, एक कोर डेटाबेस (iOS5 में) बनाया जा सकता है या तो द्वारा: एक नई परियोजना बनाते समय एप्लिकेशन टेम्पलेट के लिए

  1. क्लिक करना "उपयोग कोर डेटा"।

पहले दृष्टिकोण के पीछे विचार यह UIManagedDocument का उपयोग करना है कि Xcode AppDelegate में कोड का एक गुच्छा डाल अपने दस्तावेज़ों निर्देशिका/लगातार दुकान समन्वयक/और मॉडल स्थापित करने के लिए नहीं है। इसके बाद यह प्रबंधित ऑब्जेक्ट CONTEXT को आपके प्रारंभिक व्यू कंट्रोलर (जिसमें सार्वजनिक एपीआई में एनएसएमएनेज ऑब्जेक्ट कॉन्टेक्स्ट प्रॉपर्टी होनी चाहिए) को पास कर दिया जाएगा और वहां से आप अन्य व्यू कंट्रोलर को सीगू करते समय बियर की बोतल की तरह संदर्भ पास कर सकते हैं। कोर डेटाबेस तक पहुंचने के लिए संदर्भ को पास करना सही प्रक्रिया है।

UIManagedDocument का उपयोग करना बहुत समान है, सिवाय इसके कि आपके ऐपडिलेगेट को अकेला छोड़ दिया गया है। आप अपने ऐप की दस्तावेज़ निर्देशिका से यूआरएल पथ का उपयोग करके एक UIManagedDocument (शायद आपके प्रारंभिक दृश्य नियंत्रक में) बनाते हैं (नोट: आपको यह देखने के लिए मैन्युअल रूप से जांचना होगा कि फ़ाइल पहले से बाहर निकली है, मौजूद है लेकिन खुला नहीं है, या मौजूद नहीं है)। फिर आप उपरोक्त के रूप में इस दस्तावेज़ के संदर्भ का उपयोग कर सकते हैं।

एक और नोट: अपने ऐपडिलेगेट में अपने संदर्भ में पॉइंटर बनाने का अच्छा विचार है ताकि आप अपने संदर्भ को स्पष्ट रूप से सहेज सकें (केवल जब यह तैयार हो!) जब ऐप क्रैश हो जाए या समाप्त हो जाए।

लगातार स्टोर समन्वयक स्वचालित रूप से आपके लिए सेट अप किया गया है और आप इसे लगातार जारी रखने के लिए इसे कॉन्फ़िगर कर सकते हैं (और वास्तव में आपको संदर्भ को लगातार सहेजने के लिए), या UIManagedDocument subclassing और वांछित विधियों को ओवरराइड करके इसे कॉन्फ़िगर कर सकते हैं।

UIManagedDocument प्रलेखन http://developer.apple.com/library/ios/#DOCUMENTATION/UIKit/Reference/UIManagedDocument_Class/Reference/Reference.html

में अवलोकन पढ़ें दोनों ही तरीकों से एक ही तरह से काम करते हैं और एक ही नियंत्रण और पहुँच प्रदान करते हैं। UIManaged दस्तावेज़ों के साथ आप एकाधिक SQLite फ़ाइलों में एकाधिक डेटाबेस बना सकते हैं, आप इसकी आवश्यकता होने तक डेटाबेस बनाने/सेट अप करने के लिए भी प्रतीक्षा कर सकते हैं। "कोर डेटा का उपयोग करें" विकल्प आपको एक एकल कोर डेटाबेस प्रदान करता है जो इसे एप्लिकेशन लोड पर सेट करता है, आपको ऐपडिलेगेट के आसपास कोरडाटा सामान को केंद्रीकृत करने की अनुमति देता है, कोडिंग समय बचाता है और एक फास्ट-ट्रैक ऐप के लिए अच्छा है। मुझे UIManagedDocument पसंद है।

यदि आपने कोर डेटा विकल्प के बिना ऐप शुरू किया है और इसे ऐपडिलेगेट में जोड़ना चाहते हैं, तो बस मूल डेटा के साथ एक नई परियोजना बनाएं और अपने कोड को अपने ऐपडिलेगेट में कॉपी करें (केवल 3 गुण और उनके एक्सेसर्स होना चाहिए दस्तावेज़ निर्देशिका तक पहुंचने के लिए एक सुविधाजनक तरीका भी)। आपको अपने प्रारंभिक दृश्य नियंत्रक, मॉडल, आदि में इंगित करने की आवश्यकता होगी ..

अद्यतन: बस एक और सुविधा जोड़ना चाहता था। अपने प्रबंधित वस्तु संदर्भ अपने AppDelegate में संग्रहीत किया जाता है, तो आप उसे अपने ऐप्लिकेशन में कहीं भी बस

NSManagedObjectContext* context = [[(AppDelegate*) [UIApplication sharedApplication] delegate] myManagedObjectContext]; 

इस होने को नकारता का उपयोग कर उसके चारों ओर पारित करने के लिए तक पहुंच सकते हैं।

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

+0

उस लंबे हवादार उत्तर के शीर्ष पर मैं आपको कहीं भी संदर्भ को पकड़ने के लिए अपने ऐपडिलेगेट में बैक-पॉइंटर का उपयोग करूंगा, लेकिन पसंदीदा दृष्टिकोण नहीं। – Patrick

+0

बिल्कुल शानदार जवाब। इसके अलावा - यहां UIManahegDocument को सहेजने के लिए एक कोड स्निपेट: [दस्तावेज़ saveToURL: document.fileURL forSaveOperation: UIDocumentSaveForOverwriting completHandler: NULL]; – brainray

7

एक सतत स्टोर समन्वयक के बिना आप अपने परिणामों को लगातार क्षेत्र (डेटाबेस, फ़ाइल इत्यादि) में सहेजने में असमर्थ होंगे ... इसलिए यदि आप लगातार डेटा प्रबंधक चाहते हैं जो पूरी तरह से बेकार है, तो NSPersistentStoreCoordinator को छोड़ दें। क्या आप सुनिश्चित हैं कि परियोजना इसका उपयोग नहीं कर रही थी? प्रोफेसर डेटा को कैसे बचा रहा था? जब आप एक नया कोर डेटा प्रोजेक्ट बनाते हैं, तो यह तर्क आपके लिए स्वत: उत्पन्न होता है।

संपादित करें: मुझे अब मिल गया है, प्रोफेसर UIManagedDocument का उपयोग कर रहा है, जो आंतरिक रूप से (फ़ाइल प्रकार के आधार पर) अपने स्वयं के लगातार स्टोर समन्वयक का उपयोग करता है, इसलिए स्पष्ट बनाने की कोई आवश्यकता नहीं है (जब तक कि आप संतुष्ट न हों चूक)। तो, अंत में, यह एक समन्वयक का उपयोग करने के बारे में नहीं है, यह है कि आप इसे स्पष्ट रूप से बनाते हैं या नहीं।

+0

हाँ मुझे यकीन है कि प्रोफेसर इसका उपयोग नहीं कर रहा था, लेकिन वह [NSEntityDescription insertNewObjectForEntityForName] का उपयोग कर मूल डेटा में ऑब्जेक्ट्स संग्रहीत कर रहा था। तर्क में स्वत: उत्पन्न कहाँ है? धन्यवाद – user1337645

+0

आपके ऐप प्रतिनिधि में, मेरा मानना ​​है। जब आप संदर्भ पर "सहेजें" कहते हैं तो यह स्टोर समन्वयक का उपयोग करने के लिए सेट अप करेगा। यदि वह उस फ़ंक्शन का उपयोग नहीं कर रहा था, तो कोर डेटा से परेशान क्यों है ... मुझे आश्चर्य है ... – borrrden

+0

कोर डेटा को प्रबंधित ऑब्जेक्ट संदर्भ, एक प्रबंधित ऑब्जेक्ट मॉडल और काम करने के लिए एक सतत स्टोर समन्वयक की आवश्यकता होती है। (आपके द्वारा संदर्भित 'insertNewObject ...' विधि पैरामीटर के रूप में एक संदर्भ लेती है, और एक संदर्भ को एक स्टोर की आवश्यकता होती है, और एक स्टोर को एक मॉडल की आवश्यकता होती है।) जो आपने शायद व्याख्यान में देखा वह टेम्पलेट प्रोजेक्ट का उपयोग था - जब आप एक नया एक्सकोड प्रोजेक्ट बनाएं और "कोर डेटा का उपयोग करें" चुनें, 'AppDelegate' कार्यान्वयन इन्हें सेट अप करने के लिए कुछ बॉयलरप्लेट कोड प्राप्त करता है। – rickster

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