Перенос основных данных: как удалить стек Core Data?

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

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

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

Ответ 1

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

Технически, это тривиальная вещь. Когда вы настроите 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];

Ответ 2

Если вы создаете пустое приложение "Основные данные", вы найдете нужный код в комментариях "Яблоки" в делетете приложения:

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

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

  • Выполнение автоматической облегченной миграции путем передачи следующего словаря в качестве параметров Параметр: @{NSMigratePersistentStoresAutomaticallyOption: @YES, NSInferMappingModelAutomaticallyOption: @YES}       Легкая миграция будет работать только для ограниченного набора изменений схемы; обратитесь к разделу "Управление версиями модели данных и переноса данных" Руководство по программированию "для деталей.