मॉडल को स्वचालित रूप से माइग्रेट करने के लिए कोर डेटा प्राप्त करने के लिए मुझे क्या करना होगा?


96

मैंने कोर डेटा मॉडल के लिए स्वचालित / हल्के प्रवासन के बारे में प्रलेखन पढ़ा है - लेकिन मुझे इसे लागू करने में समस्या आ रही है।

जैसा कि मैं समझता हूं कि एप्लिकेशन को यह नोटिस करना चाहिए कि उसके पास जो मॉडल है और जो डिवाइस पहले से मौजूद है वह मॉडल समान नहीं हैं। यदि आपने केवल विशेषताओं या संबंधों और समान सरल परिवर्तनों को जोड़ा है तो मॉडल को स्वचालित रूप से उन्नत किया जाना चाहिए।

किसी भी संकेत - क्या मुझे Xcode में कुछ सेट करने की आवश्यकता है?

जवाबों:


138

मुझे अब पता चला है कि यह काफी सरल है - एक बार जब आप जानते हैं कि कहाँ देखना है।

मेरे AppDelegate में मैंने NSPersistentStoreCoordinator की स्थापना की - और आपको ऑटो-माइग्रेट को संभालने के लिए इसे बताने के लिए इसमें कुछ विकल्प जोड़ने की आवश्यकता है:

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:

[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,

[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];

NSError *error;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];

if (![_persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
    // Handle error
    NSLog(@"Problem with PersistentStoreCoordinator: %@",error);
}

फिर आपको xCode में थोड़ी ट्रिक करने की आवश्यकता है:

  1. अपनी xcdatamodel फ़ाइल चुनें
  2. शीर्ष पर डिज़ाइन मेनू चुनें - फिर डेटा मॉडल - फिर मॉडल संस्करण जोड़ें चुनें
  3. आपकी xcdatamodel फ़ाइल फिर आपकी xcdatamodel फ़ाइल के समान नाम के साथ एक नई निर्देशिका में स्थानांतरित हो जाएगी, लेकिन विस्तार xcdatamodeld के साथ - इस निर्देशिका में एक दूसरी फ़ाइल होगी जिसमें नाम 2 होगा। नई फ़ाइल चुनें और फिर डिज़ाइन करें-> डेटा मॉडल-> वर्तमान संस्करण सेट करें ( Xcode 4 में आप ऐसा करते हैं )
  4. यदि आपने पहले ही बदलाव कर लिया है जिससे आपकी परियोजना असंगत हो गई है - तो इन परिवर्तनों को मूल xcdatamodel फ़ाइल से बाहर निकालें। यदि आपको अभी तक परिवर्तन नहीं करना है - तो बस 2.xcdatamodel फ़ाइल (जिसे आपने अभी-अभी चालू संस्करण बनाया है) संपादित करें।
  5. अब जब आप इस संस्करण को पुराने मॉडल वाले डिवाइस पर स्थापित करते हैं - यह स्वचालित रूप से उस मॉडल को नए मॉडल में अपग्रेड कर देगा।

यह बहुत अच्छा और उतना ही सरल लगता है जितना मैं चाहता था - लेकिन मुझे लगता है कि आपको विकास के दौरान सावधानी बरतने की ज़रूरत है क्योंकि आप एक मॉडल बदलते हैं - अन्यथा आपको प्रत्येक परिवर्तन के लिए एक नया संस्करण बनाना होगा।

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


अद्यतन (15/07/2011):

सेब पर अद्यतन प्रलेखन है इंगित करने के लिए @ रॉकस्टारबर्लिन के लिए धन्यवाद :

Xcode 4: एक प्रबंधित ऑब्जेक्ट मॉडल का वर्तमान संस्करण सेट करना

अपडेट: 8/19/2013 बेहतर लिंक:

https://developer.apple.com/library/content/documentation/Cocoa/Conceptual/CoreDataVersioning/Articles/vmModelFormat.html


मैं कोर डेटा माइग्रेशन और वर्जनिंग गाइड को पढ़ने का सुझाव देता हूं, जो Xcode doc दर्शक और developer.apple.com पर उपलब्ध है।
हंटर

1
मुझे इसका जवाब नहीं मिला, बस यह पता चला - यह करने में समय लगा।
ग्रोचल

NSInferMappingModelAutomaticallyOption अच्छी तरह से काम करता है, लेकिन केवल साधारण मैपिंग के लिए, जैसे किसी विशेषता का नाम बदलना। कुछ अधिक जटिल (रिश्तों को हटाने, या संस्थाओं को जोड़ने) के लिए आपको एक मैपिंग मॉडल जोड़ना होगा। यदि Xcode शिकायत करता है कि NSInferMappingModelAutomaticallyOption अघोषित है, तो अपने ऐप प्रतिनिधि हेडर फ़ाइल में #import <CoreData / CoreData.h> जोड़ें।
Elise van Looij

मैंने अपने मॉडल में कुछ इकाइयाँ जोड़ीं और बदनाम हो गया "स्टोर खोलने के लिए उपयोग किया जाने वाला मॉडल स्टोर बनाने में उपयोग की जाने वाली त्रुटि के साथ असंगत है"। आपके समाधान ने इसे ठीक कर दिया! आपका बहुत बहुत धन्यवाद!
करस्टेन सिल्ज़

1
अगर आपको इन निर्देशों का पालन करने के बाद "त्रुटि नाम की दो अलग-अलग संस्थाओं के साथ मॉडल नहीं मिला सकते हैं" तो संतोष का जवाब नीचे देखें।
बेंवोलियो टीटी

14

यह अविश्वसनीय रूप से सहायक था। Apple प्रलेखन था - हमेशा की तरह - अधूरा अधूरा। मैं एक साफ निर्माण करने की सलाह देता हूं, क्योंकि मैं एक त्रुटि में भाग गया था "दो अलग-अलग संस्थाओं के साथ मॉडल विलय नहीं कर सकते हैं xxx" जब मैं पहली बार अपने परिवर्तन करने के बाद भाग गया। क्लीन बिल्ड ने इसे ठीक किया।


एक साफ निर्माण ने मेरे मुद्दों को भी तय किया।
14

6

ग्रोचल का उत्तर एकदम सही है ... लेकिन अगर आप अभी भी "दो अलग-अलग संस्थाओं के साथ मॉडल को विलय नहीं कर सकते हैं xxx" तो कई बार बिल्ड को साफ करने के बाद भी ... आपके पास समस्याएँ हो सकती हैं कि कैसे प्रबंधितOOjectModel को लोड किया जा रहा है .. .take इस पर एक नज़र ... जिसने मुझे इसे ठीक करने में मदद की ..

कोर डेटा माइग्रेशन की समस्या


3

इसके अलावा, यदि आप इस पद पर ठोकर खाते हैं, जैसे मैंने किया, "स्टोर खोलने के लिए उपयोग किया जाने वाला मॉडल स्टोर बनाने के लिए उपयोग किए जाने वाले के साथ असंगत है" त्रुटि और आप बस सिम्युलेटर का उपयोग करके डीबग कर रहे हैं और पूरी तरह से प्रतिस्थापित करना चाहते हैं। पुराने मॉडल को स्थापित किया गया है, आप बस सिम्युलेटर ऐप को रीसेट कर सकते हैं या सिम्युलेटर से अपना ऐप हटा सकते हैं।

यह मेरे लिए तब तक नहीं हुआ जब तक मैंने यहां पोस्ट्स को पढ़ने की कोशिश नहीं की, जिस बिंदु पर मैंने महसूस किया कि मैंने सिम्युलेटर में ऐप इंस्टॉल कर लिया है और फिर बाद में मॉडल को बदल दिया, जिससे उपरोक्त रन-टाइम त्रुटि हुई।


1

संतोष के जवाब पर अमल करने के लिए, मुझे लगा कि मैं कोड स्निपेट यहीं पोस्ट करूंगा। initWithContentsOfURL:इसके बजाय mergedModelFromBundles:आपको अपना प्रबंधितObjectModel बनाने की आवश्यकता है अन्यथा आपको त्रुटि मिलेगी:

दो अलग-अलग संस्थाओं XXX और XXX के साथ मॉडल मर्ज नहीं कर सकते

यदि आपकी मॉडल फ़ाइल का नाम "मॉडल" है, तो यहां बताया गया है कि आप कैसे प्रबंधित करेंObjectModel:

NSString *path = [[NSBundle mainBundle] pathForResource:@"Model" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL]; 

करने के लिए क्रेडिट इस ब्लॉग पोस्ट


1

Xcode 4 में मेनू थोड़ा बदल गया। यहाँ वर्णन कैसे Xcode 4 में करना है:

Xcode 4: एक प्रबंधित ऑब्जेक्ट मॉडल का वर्तमान संस्करण सेट करना


लिंक पहले ही टूट चुका है। Apple प्रलेखन के लिंक लगभग दो महीने तक
चले

1

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

जैसे ही मैंने सुनिश्चित किया कि मेरे नए कॉलम में "वैकल्पिक" जाँच है, मैंने फिर से माइग्रेशन की कोशिश की और यह काम कर गया।


1

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

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

वहाँ समाधान मेरे विन्यास को देखने के लिए था, मुझे एहसास हुआ कि मेरे पास एक इकाई थी जो वर्तमान में किसी भी विन्यास में नहीं थी, और इसे एक में जोड़ें। सपने की तरह चलता है।

यह ओपी की समस्या को ठीक नहीं करेगा। लेकिन शायद कुछ निराश व्यक्ति जो यहाँ गूगल के माध्यम से उतरते हैं वे उस नाव में होंगे जो मैं था :)



0

Xcode संस्करण 5 के लिए @ Grouchal के भयानक निर्देशों के लिए लघु संपादन:

पुराना: 2. शीर्ष पर डिज़ाइन मेनू का चयन करें - फिर डेटा मॉडल - फिर मॉडल संस्करण जोड़ें चुनें

संस्करण 5+: 2. संपादक मेनू का चयन करें, फिर मॉडल संस्करण जोड़ें ..., अपना संस्करण नाम लिखें और मॉडल के आधार पर (सूची में अपना मूल मॉडल चुनें)

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