Легкая миграция

Если Вы просто вносите простые изменения в свою модель (такие как добавление нового атрибута к объекту), Базовые Данные могут выполнить автоматическую миграцию данных, называемую легкой миграцией. Легкая миграция является существенно тем же как обычной миграцией, за исключением того, что вместо Вас обеспечивающий отображающуюся модель (как описано в Отображающемся Обзоре), Базовые Данные выводят один из различий между источником и целевыми моделями управляемого объекта.

Легкая миграция особенно удобна во время ранних стадий разработки приложений, когда можно изменять модель управляемого объекта часто, но Вы не хотите должными быть продолжать регенерировать данные тестирования. Можно переместить существующие данные, не имея необходимость создавать пользовательскую модель отображения для каждой версии модели, используемой для создания хранилища, которое должно было бы быть перемещено.

Дальнейшее преимущество использования легкой миграции — вне факта, что Вы не должны создавать отображающуюся модель сами — состоит в том, что при использовании выведенной модели и Вы используете хранилище SQLite, затем Базовые Данные могут выполнить миграцию на месте (исключительно путем выпуска SQL-операторов). Это может представлять значительный выигрыш в производительности, поскольку Базовые Данные не должны загружать ни одни из Ваших данных. Из-за этого Вы призваны использовать выведенную миграцию, если это возможно, даже если бы отображающаяся модель, которую Вы могли бы создать сами, была бы тривиальна.

Базовые данные должны быть в состоянии вывести отображение

Для выполнения автоматической легкой миграции Базовые Данные должны быть в состоянии найти источник и целевые модели управляемого объекта сам во время выполнения. Базовые Данные ищут модели в пакетах, возвращенных NSBundle allBundles и allFrameworks методы. Если Модели не Могут быть Найдены Автоматически, при хранении моделей в другом месте необходимо выполнить шаги, описанные в Использовании менеджер по Миграции. Базовые Данные должны тогда проанализировать изменения схемы в персистентных объектах и свойствах и генерировать выведенную модель отображения.

Для Базовых Данных, чтобы быть в состоянии генерировать выведенную модель отображения, изменения должны соответствовать очевидному образцу миграции, например:

При переименовании объекта или свойства можно установить идентификатор переименования в целевой модели к имени соответствующего свойства или объекта в исходной модели. Вы устанавливаете идентификатор переименования в модели управляемого объекта использование подручного меню инструмента Xcode Data Modeling (или для объекта или для свойства). Например, Вы можете:

Идентификатор переименования создает «каноническое имя», таким образом, необходимо установить идентификатор переименования в имя свойства в исходной модели (если то свойство уже не имеет идентификатор переименования). Это означает, что можно переименовать свойство в версии 2 модели, тогда переименовывают его снова версия 3, и переименование будет работать, правильно идя от версии 2 до версии 3 или от версии 1 до версии 3.

Кроме того, Базовая Информационная поддержка:

Запросите автоматическую миграцию Используя словарь опций

Вы запрашиваете автоматическую легкую миграцию с помощью словаря опций, в котором Вы передаете addPersistentStoreWithType:configuration:URL:options:error:, путем установки значений, соответствующих обоим NSMigratePersistentStoresAutomaticallyOption и NSInferMappingModelAutomaticallyOption ключи к YES:

NSError *error = nil;
NSURL *storeURL = <#The URL of a persistent store#>;
NSPersistentStoreCoordinator *psc = <#The coordinator#>;
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
 
BOOL success = [psc addPersistentStoreWithType:<#Store type#>
                    configuration:<#Configuration or nil#> URL:storeURL
                    options:options error:&error];
if (!success) {
    // Handle the error.
}

Если Вы хотите определить заранее, могут ли Базовые Данные вывести отображение между исходными и целевыми моделями, фактически не выполняя работу миграции, можно использовать NSMappingModel inferredMappingModelForSourceModel:destinationModel:error: метод. Это возвращает выведенную модель, если Базовые Данные в состоянии создать ее, иначе nil.

Используйте менеджера по Миграции, если Модели не Могут быть Найдены Автоматически

Для выполнения автоматической миграции Базовые Данные должны быть в состоянии найти источник и целевые модели управляемого объекта сам во время выполнения (см., что Базовые Данные Должны Быть в состоянии Вывести Отображение). Если необходимо поместить модели в расположения не проверенное автоматическое обнаружение, то необходимо генерировать выведенную модель и инициировать миграцию сами с помощью менеджера по миграции (экземпляр NSMigrationManager).

Следующий пример кода иллюстрирует, как генерировать выведенную модель и инициировать миграцию с помощью менеджера по миграции. Код предполагает реализацию двух методов —sourceModel и destinationModel— тот возврат источник и целевые модели управляемого объекта соответственно.

- (BOOL)migrateStore:(NSURL *)storeURL toVersionTwoStore:(NSURL *)dstStoreURL error:(NSError **)outError {
 
    // Try to get an inferred mapping model.
    NSMappingModel *mappingModel =
        [NSMappingModel inferredMappingModelForSourceModel:[self sourceModel]
                        destinationModel:[self destinationModel] error:outError];
 
    // If Core Data cannot create an inferred mapping model, return NO.
    if (!mappingModel) {
        return NO;
    }
 
    // Create a migration manager to perform the migration.
    NSMigrationManager *manager = [[NSMigrationManager alloc]
        initWithSourceModel:[self sourceModel] destinationModel:[self destinationModel]];
 
    BOOL success = [manager migrateStoreFromURL:storeURL type:NSSQLiteStoreType
        options:nil withMappingModel:mappingModel toDestinationURL:dstStoreURL
        destinationType:NSSQLiteStoreType destinationOptions:nil error:outError];
 
    return success;
}