दिलचस्प पोस्ट
पाठ के बीच का अंतर कैसे बढ़ाएं और सीएसएस में अधोरेखण कैसे करें पोस्टग्रे में ऑटो इयर्रीमेंट काउंटर रीसेट करें एंड्रॉइड में रिमाइंडर कैसे सेट करें? अजगर में फ़ाइल आकार कैसे जांचें? स्विफ्ट में एक UIButton के गोल शीर्ष कोनों साधारण PHP SQL लॉगिन समस्या निवारण दृश्य स्टूडियो में निर्माण करते समय सशर्त 32/64 बिट संदर्भ का उपयोग करें एक्सएसडी से जेएसीएबी कक्षाएं कैसे उत्पन्न करें? क्या 'ओवरराइड' कीवर्ड सिर्फ ओवरराइड वर्चुअल पद्धति के लिए एक चेक है? एक डबल में दशमलव अंकों की संख्या क्या मैं जीवनकाल का उपयोग कर जंग स्ट्रैक्ट्स बनाने के लिए करता हूं जो कि एक-दूसरे को चक्रीय रूप से संदर्भित करते हैं? क्रोम एक्सप्लोरेशन पहले रन / अपडेट का पता लगाएं इस वर्ग की कुंजी मान कोडन-अनुरूप नहीं है "./" (डॉट स्लैश) क्या एक HTML फ़ाइल पथ स्थान के संदर्भ में है? $ नोटेशन का उपयोग करते हुए डेटा फ्रेम स्तंभ का चयन करने के लिए स्ट्रिंग चर का उपयोग कैसे करें

एकाधिक पास के साथ कोर डेटा माइग्रेशन के उदाहरण या स्पष्टीकरण?

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

Solutions Collecting From Web of "एकाधिक पास के साथ कोर डेटा माइग्रेशन के उदाहरण या स्पष्टीकरण?"

मैंने पता लगाया है कि एप्पल उनके दस्तावेजों में संकेत करता है यह वास्तव में बहुत आसान है लेकिन यह स्पष्ट होने से पहले एक लंबा रास्ता तय करना है मैं एक उदाहरण के साथ स्पष्टीकरण समझाता हूँ प्रारंभिक स्थिति ये है:

डेटा मॉडल संस्करण 1

यहां छवि विवरण दर्ज करेंयहां छवि विवरण दर्ज करें

यह मॉडल है जिसे आप "कोर डेटा संग्रहण के साथ नेविगेशन आधारित ऐप" टेम्पलेट के साथ एक प्रोजेक्ट बनाते हैं। मैंने इसे संकलित किया और कुछ अलग-अलग मूल्यों के साथ लगभग 2k प्रविष्टियों को बनाने के लिए लूप के कुछ मदद से कुछ मुश्किलों को मार दिया। वहां हम एक NSDate मूल्य के साथ 2.000 घटनाएं करते हैं।

अब हम डेटा मॉडल का दूसरा संस्करण जोड़ते हैं, जो इस तरह दिखता है:

यहां छवि विवरण दर्ज करें

डेटा मॉडल संस्करण 2

अंतर यह है: इवेंट इकाई चली गई है, और हमें दो नए लोग मिले हैं। जो एक टाइमस्टैम्प को double और दूसरा वाला भंडार देता है, जिसे NSString रूप में एक तारीख को संग्रहीत करना चाहिए।

लक्ष्य सभी संस्करण 1 ईवेंट को दो नए संस्थाओं में स्थानांतरित करना है और माइग्रेशन के साथ मूल्यों को रूपांतरित करना है। यह प्रत्येक मूल्यों को एक अलग प्रकार के रूप में एक अलग प्रकार के रूप में दो बार देता है।

माइग्रेट करने के लिए, हम हाथ से प्रवास का चयन करते हैं और यह हम मानचित्रण मॉडल के साथ करते हैं। यह आपके प्रश्न का उत्तर का पहला भाग भी है। हम दो चरणों में माइग्रेशन करेंगे, क्योंकि यह 2k प्रविष्टियों को स्थानांतरित करने के लिए लंबा ले रहा है और हम स्मृति पदचिह्न को कम रखना चाहते हैं।

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

हमारे दो मैपिंग मॉडल पर वापस जाएं

हम इस तरह पहले मानचित्रण मॉडल बनाते हैं:

1. नई फाइल -> संसाधन -> मानचित्रण मॉडल यहां छवि विवरण दर्ज करें

2. एक नाम चुनें, मैंने StepOne को चुना है I

3. सेट स्रोत और गंतव्य डेटा मॉडल

यहां छवि विवरण दर्ज करें

मानचित्रण मॉडल एक कदम

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

यहां छवि विवरण दर्ज करें

मल्टी पास माइग्रेशन को कस्टम इकाई माइग्रेशन नीतियों की आवश्यकता नहीं है, हालांकि हम इस उदाहरण के लिए थोड़ी अधिक जानकारी प्राप्त करने के लिए ऐसा करेंगे। इसलिए हम इकाई में एक कस्टम नीति जोड़ते हैं। यह हमेशा NSEntityMigrationPolicy उपवर्ग है।

यहां छवि विवरण दर्ज करें

यह नीति वर्ग हमारे प्रवासन को बनाने के लिए कुछ तरीकों को लागू करता है। हालांकि इस मामले में यह आसान है इसलिए हमें केवल एक ही विधि को लागू करना होगा: createDestinationInstancesForSourceInstance:entityMapping:manager:error: :।

कार्यान्वयन इस तरह दिखेगा:

StepOneEntityMigrationPolicy.m

 #import "StepOneEntityMigrationPolicy.h" @implementation StepOneEntityMigrationPolicy - (BOOL)createDestinationInstancesForSourceInstance:(NSManagedObject *)sInstance entityMapping:(NSEntityMapping *)mapping manager:(NSMigrationManager *)manager error:(NSError **)error { // Create a new object for the model context NSManagedObject *newObject = [NSEntityDescription insertNewObjectForEntityForName:[mapping destinationEntityName] inManagedObjectContext:[manager destinationContext]]; // do our transfer of nsdate to nsstring NSDate *date = [sInstance valueForKey:@"timeStamp"]; NSDateFormatter *dateFormatter = [[NSDateFormatter alloc] init]; [dateFormatter setTimeStyle:NSDateFormatterMediumStyle]; [dateFormatter setDateStyle:NSDateFormatterMediumStyle]; // set the value for our new object [newObject setValue:[dateFormatter stringFromDate:date] forKey:@"printedDate"]; [dateFormatter release]; // do the coupling of old and new [manager associateSourceInstance:sInstance withDestinationInstance:newObject forEntityMapping:mapping]; return YES; } 

अंतिम कदम: माइग्रेशन ही

मैं दूसरे मैपिंग मॉडल को स्थापित करने के लिए हिस्सा छोड़ दूँगा जो लगभग समान है, केवल एक समय अंतराल। सन 1 9 70 एनएसडीटी को डबल में परिवर्तित करने के लिए इस्तेमाल किया गया था।

अंत में हमें माइग्रेशन को ट्रिगर करने की आवश्यकता है। मैं अभी के लिए बॉयलरप्लेट कोड छोड़ूँगा अगर आपको इसकी आवश्यकता है, तो मैं यहां पोस्ट करूंगा। यह माइग्रेशन प्रक्रिया को कस्टमाइज़ करने में पाया जा सकता है, यह केवल पहले दो कोड उदाहरणों का मर्ज है। तीसरे और अंतिम भाग को निम्नानुसार संशोधित किया जाएगा: NSMappingModel वर्ग mappingModelFromBundles:forSourceModel:destinationModel: NSMappingModel के क्लास विधि का उपयोग करने के बजाय: mappingModelFromBundles:forSourceModel:destinationModel: हम mappingModelFromBundles:forSourceModel:destinationModel: का उपयोग करेंगे क्योंकि क्लास विधि केवल एक ही वापस mappingModelFromBundles:forSourceModel:destinationModel: , शायद सबसे पहला मैपिंग मॉडल बंडल

अब हमें दो मैपिंग मॉडेल्स मिल चुके हैं जिनका इस्तेमाल एलओपीपी के प्रत्येक पास में किया जा सकता है और माइग्रेशन मैनेजर को माइग्रेशन मैनेजर को भेज सकते हैं। बस।

 NSArray *mappingModelNames = [NSArray arrayWithObjects:@"StepOne", @"StepTwo", nil]; NSDictionary *sourceStoreOptions = nil; NSURL *destinationStoreURL = [[self applicationDocumentsDirectory] URLByAppendingPathComponent:@"CoreDataMigrationNew.sqlite"]; NSString *destinationStoreType = NSSQLiteStoreType; NSDictionary *destinationStoreOptions = nil; for (NSString *mappingModelName in mappingModelNames) { NSURL *fileURL = [[NSBundle mainBundle] URLForResource:mappingModelName withExtension:@"cdm"]; NSMappingModel *mappingModel = [[NSMappingModel alloc] initWithContentsOfURL:fileURL]; BOOL ok = [migrationManager migrateStoreFromURL:sourceStoreURL type:sourceStoreType options:sourceStoreOptions withMappingModel:mappingModel toDestinationURL:destinationStoreURL destinationType:destinationStoreType destinationOptions:destinationStoreOptions error:&error2]; [mappingModel release]; } 

टिप्पणियाँ

  • मैपिंग मॉडल बंडल में cdm में समाप्त होता है

  • गंतव्य स्टोर प्रदान किया जाना चाहिए और स्रोत स्टोर नहीं होना चाहिए। सफल प्रवासन के बाद आप पुराने को हटा सकते हैं और नया नाम बदल सकते हैं।

  • मैपिंग मॉडल के निर्माण के बाद मैंने डेटा मॉडल में कुछ बदलाव किए, इसके परिणामस्वरूप कुछ संगतता त्रुटियां हुईं, जिससे मैं मानचित्रण मॉडल को पुनः बनाने के साथ ही हल कर सकता था।

ये प्रश्न संबंधित हैं:

आईफोन पर बड़े कोरडाटा डेटास्टोर माइग्रेट करने वाली स्मृति समस्याएं

IOS के साथ अलग-अलग पास कोर डाटा माइग्रेशन

पहली कड़ी उद्धृत करने के लिए:

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

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

एक बार व्यक्ति तालिका की गई, तो आप छात्र तालिका को बदल सकते हैं। फिर कोर्स और उसके बाद क्लास पर हॉप करें, और अंत में पंजीकरण तालिका।

अन्य विचार रिकार्ड की संख्या है, अगर व्यक्ति की तरह हजार पंक्तियाँ होती हैं, तो आपको हर 100 या तो, एक रिलीज के समतुल्य NSManagedObject को निष्पादित करना होता है, जो प्रबंधित ऑब्जेक्ट प्रसंग को बताता है [एमओसी रिफ्रेशऑब्जेक्ट: ओब मर्ज चेंज: नहीं]; इसके अलावा अपने बासी डेटा टाइमर के तरीके को कम सेट करें, ताकि स्मृति को अक्सर फ़्लश किया जाए।