Вместо объединения всех моделей в
расслоение, я указал две модели
Я хочу использовать (модель 1 и новый
версия модели 2) и слил их
используя modelByMergingModels:
Это не похоже на правду. Зачем объединять модели? Вы хотите использовать модель 2 , перенося ваш магазин из модель 1 .
Из ссылки на класс NSManagedObjectModel
modelByMergingModels:
Создает один
модель из массива существующих
моделей.
Вам не нужно делать что-то особенное / специфическое с вашей исходной моделью ( модель 1 ) ... только пока она находится в вашем комплекте, процесс автоматической облегченной миграции обнаружит и будет использовать ее.
Я бы предложил отказаться от модели сопоставления, созданной вами в XCode, поскольку я увидел ужасную производительность по сравнению с автоматическими облегченными миграциями. Ваш пробег может отличаться, мои изменения между моделями отличаются от ваших, но я не удивлюсь. Попробуйте использовать время с вашей собственной моделью сопоставления и без нее.
/* Inferred mapping */
NSError *error;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,nil];
NSPersistentStore *migratedStore = [persistentStoreCoordinator addPersistentStoreWithType:nil
configuration:nil
URL:self.storeURL
options:options
error:&error];
migrationWasSuccessful = (migratedStore != nil);
Вы можете проверить в своем коде, что ваша исходная модель доступна, попытавшись загрузить ее и убедиться, что она не равна nil:
NSString *modelDirectoryPath = [[NSBundle mainBundle] pathForResource:@"YourModelName" ofType:@"momd"];
if (modelDirectoryPath == nil) return nil;
NSString *modelPath = [modelDirectoryPath stringByAppendingPathComponent:@"YourModelName"];
NSURL *modelFileURL = [NSURL fileURLWithPath:modelPath];
NSManagedObjectModel *modelOne = [[NSManagedObjectModel alloc] initWithContentsOfURL:modelFileURL];
if (modelOne == nil) {
NSLog(@"Woops, Xcode lost my source model");
}
else {
[modelOne release];
}
Предполагается, что в вашем проекте есть ресурс " YourModelName.xcdatamodeld " и " YourModelName.xcdatamodel ".
Кроме того, вы можете проверить, совместима ли эта модель с существующим постоянным хранилищем перед миграцией:
NSError *error;
NSDictionary *storeMeta = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType:nil URL:self.storeURL error:&error];
if (storeMeta == nil) {
// Unable to read store meta
return NO;
}
BOOL isCompatible = [modelOne isConfiguration:nil compatibleWithStoreMetadata:storeMeta];
В этом коде предполагается, что у вас есть метод -storeURL
для указания места загрузки постоянного хранилища.