Миграция основных данных завершилась ошибкой: не удалось сохранить новое хранилище после первого прохода миграции - PullRequest
4 голосов
/ 26 апреля 2010

В прошлом я уже успешно реализовал автоматическую миграцию с версии 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. Любая подсказка? Я делаю что-то неправильно? Заранее спасибо.

Ответы [ 2 ]

1 голос
/ 17 июня 2013

Для чего стоит, пакет утилит Magical Record Core Data включает в себя этот хак:

[coordinator MR_addAutoMigratingSqliteStoreNamed:storeFileName];

//HACK: lame solution to fix automigration error "Migration failed after first pass"
if ([[coordinator persistentStores] count] == 0) 
{
    [coordinator performSelector:@selector(MR_addAutoMigratingSqliteStoreNamed:) withObject:storeFileName afterDelay:0.5];
}

Вы можете попробовать что-то подобное. Однако мне не удалось найти объяснение, в чем заключается проблема, или почему бы просто повторить попытку.

1 голос
/ 30 апреля 2010

Я тоже столкнулся с этим, и после прочтения столько документов Apple и веб-публикаций, сколько я смог найти, ответа, похоже, не было.В моем случае ручная миграция тоже работала, но когда я открывал нового координатора, это выдает ту же ошибку, что и у вас.В конце концов я решил вернуться к моей последней рабочей версии модели данных и сделать серию небольших изменений / версий и посмотреть, где она сломала возможности автоматической миграции, чтобы углубиться в нее, и оказалось, что это не так.Теперь я могу добавлять объекты, атрибуты и отношения без проблем, и они автоматически переносятся.Есть ли шанс, что вы удалили промежуточную версию модели данных?

...