मुझे लगता है कि 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 पर नहीं? मेरा झुकाव यह है कि निर्मित माइग्रेशन कोड की तरह यह काफी सरल है कि किसी कारण से मानचित्रण मॉडल नहीं मिल रहा है, लेकिन मैं यह नहीं समझ सकता कि यह क्या होना चाहिए।
मैं ठीक उसी समस्या और समाधान था (तब विपणन विभाग। समर्थन OS X 10.5 इसलिए मैं मैनुअल प्रवास कोड को निकालने के समाप्त हो गया बंद करने का फैसला)। – cdelacroix
मुझे लगता है कि ऑटो माइग्रेशन फीचर्स/मजबूती पोस्ट -10.5 ... – nielsbot
मुझे यकीन है कि उनके पास है, लेकिन मैं इतना जटिल नहीं कर रहा हूं कि मैं असफल होने की उम्मीद करता हूं। वैसे भी, अगली फिल्म में, इस एप्लिकेशन को हो जाएगा 10.6+ केवल, तो यह कोई मुद्दा नहीं रह है, और मैं कुछ बिंदु पर वर्तमान मैनुअल प्रवास कोड निकालने जा रहे हैं। यह जानना अच्छा होगा कि यह क्यों हुआ, हालांकि। –