Легкая миграция
Если Вы просто вносите простые изменения в свою модель (такие как добавление нового атрибута к объекту), Базовые Данные могут выполнить автоматическую миграцию данных, называемую легкой миграцией. Легкая миграция является существенно тем же как обычной миграцией, за исключением того, что вместо Вас обеспечивающий отображающуюся модель (как описано в Отображающемся Обзоре), Базовые Данные выводят один из различий между источником и целевыми моделями управляемого объекта.
Легкая миграция особенно удобна во время ранних стадий разработки приложений, когда можно изменять модель управляемого объекта часто, но Вы не хотите должными быть продолжать регенерировать данные тестирования. Можно переместить существующие данные, не имея необходимость создавать пользовательскую модель отображения для каждой версии модели, используемой для создания хранилища, которое должно было бы быть перемещено.
Дальнейшее преимущество использования легкой миграции — вне факта, что Вы не должны создавать отображающуюся модель сами — состоит в том, что при использовании выведенной модели и Вы используете хранилище SQLite, затем Базовые Данные могут выполнить миграцию на месте (исключительно путем выпуска SQL-операторов). Это может представлять значительный выигрыш в производительности, поскольку Базовые Данные не должны загружать ни одни из Ваших данных. Из-за этого Вы призваны использовать выведенную миграцию, если это возможно, даже если бы отображающаяся модель, которую Вы могли бы создать сами, была бы тривиальна.
Базовые данные должны быть в состоянии вывести отображение
Для выполнения автоматической легкой миграции Базовые Данные должны быть в состоянии найти источник и целевые модели управляемого объекта сам во время выполнения. Базовые Данные ищут модели в пакетах, возвращенных NSBundle
allBundles
и allFrameworks
методы. Если Модели не Могут быть Найдены Автоматически, при хранении моделей в другом месте необходимо выполнить шаги, описанные в Использовании менеджер по Миграции. Базовые Данные должны тогда проанализировать изменения схемы в персистентных объектах и свойствах и генерировать выведенную модель отображения.
Для Базовых Данных, чтобы быть в состоянии генерировать выведенную модель отображения, изменения должны соответствовать очевидному образцу миграции, например:
Простое добавление нового атрибута
Удаление атрибута
Обязательный атрибут, становящийся дополнительным
Дополнительный атрибут, становящийся обязательным, и определяющий значение по умолчанию
Переименование объекта или свойства
При переименовании объекта или свойства можно установить идентификатор переименования в целевой модели к имени соответствующего свойства или объекта в исходной модели. Вы устанавливаете идентификатор переименования в модели управляемого объекта использование подручного меню инструмента Xcode Data Modeling (или для объекта или для свойства). Например, Вы можете:
Переименуйте Автомобильный объект к Автомобилю
Переименуйте автомобиль
color
атрибут кpaintColor
Идентификатор переименования создает «каноническое имя», таким образом, необходимо установить идентификатор переименования в имя свойства в исходной модели (если то свойство уже не имеет идентификатор переименования). Это означает, что можно переименовать свойство в версии 2 модели, тогда переименовывают его снова версия 3, и переименование будет работать, правильно идя от версии 2 до версии 3 или от версии 1 до версии 3.
Кроме того, Базовая Информационная поддержка:
Добавление отношений и изменение типа отношения
Можно добавить новое отношение или удалить существующее отношение.
Переименование отношения (при помощи идентификатора переименования, точно так же, как атрибут)
Изменение отношения от до - одного к к - многие или неупорядоченный - многие к упорядоченному (и виза-versa)
Изменение иерархии объекта
Можно добавить, удалить, переименовать объекты
Можно создать новый родительский или дочерний объект и переместить свойства вверх и вниз по иерархии объекта
Можно переместить объекты из иерархии
Вы не можете, однако, объединить иерархии объекта; если два существующих объекта не совместно используют общего родителя в источнике, они не могут совместно использовать общего родителя в месте назначения
Запросите автоматическую миграцию Используя словарь опций
Вы запрашиваете автоматическую легкую миграцию с помощью словаря опций, в котором Вы передаете 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; |
} |