Миграция основных данных: как удалить стек основных данных? - PullRequest
12 голосов
/ 17 января 2012

Мой план состоит в том, чтобы удалить старый стек основных данных (файл NSManagedObjectModel .momd и файл NSPersistentStore .sqlite), поскольку:

  • У меня нет опыта миграции основных данных.
  • новая схема .xcdatamodel полностью отличается от старой.
  • Я могу безопасно удалить старые данные пользователя, поскольку они все хранятся на нашем сервере, и новое приложение в любом случае загружает последние данные с нашего сервера.

В этом случае является ли полное удаление лучшим способом миграции?

Ответы [ 2 ]

14 голосов
/ 17 января 2012

Это вполне допустимая вещь, если ваше приложение все равно требует доступа в Интернет. В противном случае пользователи могут остаться с пустым набором данных (вы удаляете старую базу данных, когда обнаруживаете, что она несовместима с текущей моделью, но вы не можете повторно заполнить ее без доступа к серверу).

Технически, это тривиальная вещь. При настройке NSPersistentStoreCoordinator:

NSURL *storeURL = ...;
NSManagedObjectModel *managedObjectModel = ...;
NSError *error = nil;
_persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel: managedObjectModel];

// Check if we already have a persistent store
if ( [[NSFileManager defaultManager] fileExistsAtPath: [storeURL path]] ) {
    NSDictionary *existingPersistentStoreMetadata = [NSPersistentStoreCoordinator metadataForPersistentStoreOfType: NSSQLiteStoreType URL: storeURL error: &error];
    if ( !existingPersistentStoreMetadata ) {
        // Something *really* bad has happened to the persistent store
        [NSException raise: NSInternalInconsistencyException format: @"Failed to read metadata for persistent store %@: %@", storeURL, error];
    }

    if ( ![managedObjectModel isConfiguration: nil compatibleWithStoreMetadata: existingPersistentStoreMetadata] ) {
        if ( ![[NSFileManager defaultManager] removeItemAtURL: storeURL error: &error] )
            NSLog(@"*** Could not delete persistent store, %@", error);
    } // else the existing persistent store is compatible with the current model - nice!
} // else no database file yet

[_persistentStoreCoordinator addPersistentStoreWithType: NSSQLiteStoreType 
                                          configuration: nil 
                                                    URL: storeURL 
                                                options: nil 
                                                  error: &error];
3 голосов
/ 13 октября 2013

Если вы создаете пустое приложение Core Data, вы найдете необходимый код в комментариях Apple в Application делегате:

Если вы столкнулись с ошибками несовместимости схем во время разработки, вы можете уменьшить их частоту с помощью:

  • Просто удаляем существующее хранилище: [[NSFileManager defaultManager] removeItemAtURL: storeURL error: nil]

  • Выполнение автоматической облегченной миграции путем передачи следующего словаряв качестве параметра параметров: @ {NSMigratePersistentStoresAutomaticsOption: @YES, NSInferMappingModelAutomaticsOption: @YES} Облегченная миграция будет работать только для ограниченного набора изменений схемы;подробности см. в «Руководстве по программированию управления версиями базовой модели данных и миграции данных».

...