2012-03-20 13 views
9

मुझे लगता है कि 10.5 तेंदुए और इसके बाद के संस्करण को लक्षित करता है एक NSPersistentDocument आधारित कोर डाटा एप्लिकेशन मिल गया है। मैं एक अद्यतन जारी करने जा रहा हूं जो डेटा मॉडल में परिवर्तन करता है, और इसलिए मौजूदा दस्तावेज़ों को नए मॉडल में माइग्रेट करने की आवश्यकता है। परिवर्तन अपेक्षाकृत सरल हैं, और मैंने उनके लिए मैपिंग मॉडल बनाया है। ध्यान दें कि मैं स्वत: हल्के प्रवास करने का प्रयास कर नहीं कर रहा हूँ, मैं एक मानचित्रण मॉडल है (हल्के प्रवास तेंदुए पर समर्थित नहीं है, लेकिन मेरे मॉडल परिवर्तन वैसे भी यह शासन)। मेरी NSPersistentDocument उपवर्ग में, मैं -configurePersistentStoreCoordinatorForURL... इस प्रकार ओवरराइड:स्वत: कोर डेटा माइग्रेशन Mac OS X 10.5 पर विफल रहता है, लेकिन पर नहीं 10.6 या 10.7

- (BOOL)configurePersistentStoreCoordinatorForURL:(NSURL *)url 
              ofType:(NSString *)fileType 
           modelConfiguration:(NSString *)configuration 
            storeOptions:(NSDictionary *)storeOptions 
              error:(NSError **)error 
{ 

    NSMutableDictionary *newOptions = (storeOptions ? 
             [NSMutableDictionary dictionaryWithDictionary:storeOptions] : 
             [NSMutableDictionary dictionary]); 
    [newOptions setObject:(id)kCFBooleanTrue forKey:NSMigratePersistentStoresAutomaticallyOption]; 
    return [super configurePersistentStoreCoordinatorForURL:url 
                ofType:fileType 
             modelConfiguration:configuration 
               storeOptions:newOptions 
                 error:error]; 

} 

यह 10.6 और 10.7 पर ठीक काम करता है। हालांकि, 10.5 पर, [super configurePersistentStore...] करने के लिए कॉल एक अपवाद फेंकता है और विफल रहता है। त्रुटि है:

Error Domain=NSCocoaErrorDomain Code=134020 UserInfo=0x15812d70 "The model configuration used to open the store is incompatible with the one that was used to create the store." 

मैं बजाय प्रवास मैन्युअल आरंभ किया है, इस कोड का उपयोग करते हैं:

NSArray *bundles = [NSArray arrayWithObject:[NSBundle mainBundle]]; 
NSManagedObjectModel *sourceModel = [NSManagedObjectModel mergedModelFromBundles:bundles forStoreMetadata:sourceMetadata]; 
NSManagedObjectModel *destinationModel = [psc managedObjectModel]; 
NSMappingModel *mappingModel = [NSMappingModel mappingModelFromBundles:bundles forSourceModel:sourceModel destinationModel:destinationModel]; 

NSMigrationManager *migrationManager = [[[NSMigrationManager alloc] initWithSourceModel:sourceModel destinationModel:destinationModel] autorelease]; 
BOOL migrationSuccessful = [migrationManager migrateStoreFromURL:backupURL 
                  type:NSXMLStoreType 
                 options:storeOptions 
               withMappingModel:mappingModel 
               toDestinationURL:url 
               destinationType:NSXMLStoreType 
               destinationOptions:storeOptions 
                  error:error]; 

return [psc addPersistentStoreWithType:NSXMLStoreType configuration:configuration URL:url options:storeOptions error:error] != nil; 

प्रवास ठीक काम करता है। हालांकि, मैं स्वचालित माइग्रेशन का उपयोग करना पसंद करूंगा, अगर किसी अन्य कारण से नहीं, क्योंकि यह क्लीनर कोड बनाता है। क्या किसी ने स्वचालित माइग्रेशन के साथ एक ही समस्या देखी है जो 10.6+ पर काम करता है लेकिन 10.5 पर नहीं? मेरा झुकाव यह है कि निर्मित माइग्रेशन कोड की तरह यह काफी सरल है कि किसी कारण से मानचित्रण मॉडल नहीं मिल रहा है, लेकिन मैं यह नहीं समझ सकता कि यह क्या होना चाहिए।

+0

मैं ठीक उसी समस्या और समाधान था (तब विपणन विभाग। समर्थन OS X 10.5 इसलिए मैं मैनुअल प्रवास कोड को निकालने के समाप्त हो गया बंद करने का फैसला)। – cdelacroix

+0

मुझे लगता है कि ऑटो माइग्रेशन फीचर्स/मजबूती पोस्ट -10.5 ... – nielsbot

+0

मुझे यकीन है कि उनके पास है, लेकिन मैं इतना जटिल नहीं कर रहा हूं कि मैं असफल होने की उम्मीद करता हूं। वैसे भी, अगली फिल्म में, इस एप्लिकेशन को हो जाएगा 10.6+ केवल, तो यह कोई मुद्दा नहीं रह है, और मैं कुछ बिंदु पर वर्तमान मैनुअल प्रवास कोड निकालने जा रहे हैं। यह जानना अच्छा होगा कि यह क्यों हुआ, हालांकि। –

उत्तर

1

मैं 100% इससे आपकी समस्या से संबंधित है नहीं कर रहा हूँ, लेकिन वहाँ कैसे 10.6 वह भी 10.5 साथ संगत होना चाहिए के लिए कोर डाटा मॉडल के विस्थापन पर एप्पल से एक दस्तावेज समाधान नहीं है। ऐसा लगता है कि 10.5 में एक विधि गुम है कि 10.6 प्रवासन के लिए निर्भर करता है।

destinationInstancesForSourceRelationshipNamed:sourceInstances:

लापता तरीका है।

उम्मीद है कि इससे मदद मिलती है।

संदर्भ: http://developer.apple.com/library/mac/#/legacy/mac/library/releasenotes/Cocoa/MigrationCrashBuild106Run105/_index.html

+0

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

+1

यह एक शॉट के लायक था। मुझे यकीन नहीं है कि लिंक क्यों काम नहीं कर रहा है। Google- ing "कोर डेटा माइग्रेशन 10.5 10.6" इस पर ऐप्पल के दस्तावेज़ों के लिए उचित लिंक लाता है। – macandyp

1

NSPersistentStore दोषी है। यह migrationManagerClass को 10.6 तक लागू नहीं करता है।

http://developer.apple.com/library/mac/#documentation/cocoa/reference/NSPersistentStore_Class/NSPersistentStore.html

एप्पल को हल करने के (के रूप में आप पहले से ही इस्तेमाल किया है) निर्माण के लिए प्रवास खुद के प्रबंधक के बजाय NSPersistentStore पर निर्भर यह प्रदान करना है।

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