2013-02-05 7 views
5

मुझे इन स्टैनफोर्ड ट्यूटोरियल https://itunes.apple.com/us/course/ipad-iphone-app-development/id495052415 मिल गए हैं, और कोर डेटा के बारे में एक व्याख्यान सुन रहे हैं, जो वास्तव में बहुत अच्छा है।UIManagedDocument और कोर डेटा

यह दिखाता है कि UIManagedDocument के माध्यम से कोर डेटा का उपयोग कैसे करें ... केवल एक चीज मुझे नहीं समझती कि UIManagedDocument जानता है कि यह किस मॉडल का उपयोग करना चाहिए, क्योंकि मुझे इसे कहीं भी सेट नहीं दिख रहा है?

UIManagedDocument का उपयोग करते समय इसे समेकित करने के लिए, आप डेटाबेस मॉडल को कैसे परिभाषित करते हैं जिसका उपयोग किया जा रहा है?

उत्तर

6

का उपयोग करते हुए मैं इस सवाल का जवाब मिला:

'UIManagedDocument' लेता है सब आपके आवेदन के मुख्य बंडल के मॉडल, और इनमें से संघ बनाते हैं मॉडल के। यदि आपके पास केवल एक मॉडल है जिसका मॉडल उपयोग किया जाता है।

इसे 'UIManagedDocument' कक्षा को ओवरराइड करके बदला जा सकता है।

+0

धन्यवाद ... मैं देख रहा हूं यह पूरे दिन। लेकिन गंभीर रूप से सेब, मुख्य डेटा और आईओएस के लिए सामान्य रूप से बहुत अधिक बॉयलरप्लेट सामान लिखना है। – user1297061

1

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

आप एक मॉडल अपने आप को लोड करने के लिए चाहते हैं, तो दो प्रणालियों का उपयोग कर सकते हैं:

आप एक ही मॉडल एक विशिष्ट URL से लोड कर सकते हैं, उदाहरण के विधि initWithContentsOfURL का उपयोग कर :. यह आम तौर पर पसंदीदा तकनीक है। आम तौर पर एक एप्लिकेशन में एक मॉडल होता है, और इस विधि का उपयोग करके आप सुनिश्चित करते हैं कि आप केवल उस मॉडल को लोड करें। आप यूआरएल के माध्यम से अलग-अलग मॉडल भी लोड कर सकते हैं और फिर मॉडलबैरिंग मॉडल्स का उपयोग करके उन्हें एकीकृत कर सकते हैं: उनके साथ एक समन्वयक को तुरंत चालू करने से पहले।

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

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

तक पहुँच तथा रनटाइम

NSManagedObjectModel *model = <#Get a model#>; 
NSFetchRequest *requestTemplate = [[NSFetchRequest alloc] init]; 
NSEntityDescription *publicationEntity = 
    [[model entitiesByName] objectForKey:@"Publication"]; 
[requestTemplate setEntity:publicationEntity]; 

NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat: 
    @"(mainAuthor.firstName like[cd] $FIRST_NAME) AND \ 
     (mainAuthor.lastName like[cd] $LAST_NAME) AND \ 
     (publicationDate > $DATE)"]; 
[requestTemplate setPredicate:predicateTemplate]; 

[model setFetchRequestTemplate:requestTemplate 
    forName:@"PublicationsForAuthorSinceDate"]; 

पर एक प्रबंधित ऑब्जेक्ट मॉडल का उपयोग करते हुए एक लाने का अनुरोध टेम्पलेट

NSManagedObjectModel *model = <#Get a model#>; 
NSError *error = nil; 
NSDictionary *substitutionDictionary = [NSDictionary dictionaryWithObjectsAndKeys: 
    @"Fiona", @"FIRST_NAME", @"Verde", @"LAST_NAME", 
    [NSDate dateWithTimeIntervalSinceNow:-31356000], @"DATE", nil]; 
NSFetchRequest *fetchRequest = 
    [model fetchRequestFromTemplateWithName:@"PublicationsForAuthorSinceDate" 
      substitutionVariables:substitutionDictionary]; 
NSArray *results = 
    [aManagedObjectContext executeFetchRequest:fetchRequest error:&error]; 
+0

मुझे नहीं लगता कि आप इस सवाल को काफी समझ गए हैं, या मुझे कम से कम आपका जवाब समझ में नहीं आया ... मैं आपको कोशिश करने के लिए वोट दूंगा ... – MegaManX