В прошлом я уже успешно реализовал автоматическую миграцию с версии 1 моей модели данных на версию 2. Теперь, используя SDK 3.1.3, миграция с версии 2 на версию 3 завершается с ошибкой:
Неразрешенная ошибка Ошибка Домен = NSCocoaErrorDomain Код = 134110 UserInfo = 0x5363360 "Операция не может быть завершена. (Ошибка Какао 134110.)", {
NSUnderlyingError = Ошибка домена = NSCocoaErrorDomain Код = 256 UserInfo = 0x53622b0 "Операция не может быть завершена. (Ошибка Какао 256.)";
reason = "Не удалось сохранить новый магазин после первого прохода миграции.";
}
Я пробовал автоматическую миграцию с использованием NSMigratePersistentStoresAutomaticallyOption
и NSInferMappingModelAutomaticallyOption
, а также миграцию с использованием только NSMigratePersistentStoresAutomaticallyOption
, предоставляя модель сопоставления от v2 к v3.
Я вижу вышеописанную ошибку, и в приложении нет доступных объектов. Однако, если я выйду из приложения и снова открою его, все будет на месте и работает.
Я использую следующие основные методы:
- (NSManagedObjectModel *)managedObjectModel {
if (managedObjectModel != nil) {
return managedObjectModel;
}
NSString *path = [[NSBundle mainBundle] pathForResource:@"MYAPP" ofType:@"momd"];
NSURL *momURL = [NSURL fileURLWithPath:path];
managedObjectModel = [[NSManagedObjectModel alloc] initWithContentsOfURL:momURL];
return managedObjectModel;
}
- (NSManagedObjectContext *) managedObjectContext {
if (managedObjectContext != nil) {
return managedObjectContext;
}
NSPersistentStoreCoordinator *coordinator = [self persistentStoreCoordinator];
if (coordinator != nil) {
managedObjectContext = [[NSManagedObjectContext alloc] init];
[managedObjectContext setPersistentStoreCoordinator: coordinator];
}
return managedObjectContext;
}
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP.sqlite"]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: [self managedObjectModel]];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
// Handle error
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
}
return persistentStoreCoordinator;
}
В симуляторе я вижу, что при этом создаются файлы MYAPP ~ .sqlite и файл MYAPP.sqlite. Я пытался удалить файл MYAPP ~ .sqlite, но
BOOL oldExists = [[NSFileManager defaultManager] fileExistsAtPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"MYAPP~.sqlite"]];
всегда возвращает NO. Любая подсказка? Я делаю что-то неправильно?
Заранее спасибо.