Автоматическая миграция Core Data не работает в Mac OS X 10.5, но не в 10.6 или 10.7.

У меня есть приложение Core Data на основе NSPersistentDocument, предназначенное для Leopard 10.5 и выше. Я собираюсь выпустить обновление, которое вносит изменения в модель данных, поэтому мне нужно перенести существующие документы в новую модель. Изменения относительно просты, и я создал для них модель сопоставления. Обратите внимание, что я не пытаюсь выполнить автоматическую упрощенную миграцию, у меня есть модель сопоставления (облегченная миграция не поддерживается в Leopard, но изменения моей модели все равно исключают ее). В моем подклассе NSPersistentDocument я переопределяю -configurePersistentStoreCoordinatorForURL... следующим образом:

- (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? Я предполагаю, что это что-то довольно простое, например, встроенный код миграции по какой-то причине не может найти модель сопоставления, но я не могу понять, что это должно быть.

9
задан Andrew Madsen 20 March 2012 в 18:05
поделиться