Инициирование процесса миграции
В этой главе описываются, как инициировать процесс миграции и как работает процесс миграции по умолчанию. Это не описывает настройку процесса миграции — это описано в Настройке Процесса Миграции.
Инициирование процесса миграции
При инициализации персистентного координатора хранилища Вы присваиваете ему модель управляемого объекта (см. initWithManagedObjectModel:
); координатор использует ту модель для открытия персистентных хранилищ. Вы открываете персистентное использование хранилища addPersistentStoreWithType:configuration:URL:options:error:
. То, как Вы используете этот метод, однако, зависит от того, использует ли Ваше приложение управление версиями модели и от того, как Вы принимаете решение поддерживать миграцию — принимаете ли Вы решение использовать процесс миграции по умолчанию или пользовательскую начальную загрузку обнаружения и миграции скоса версии. Следующий список описывает различные сценарии и что необходимо сделать в каждом:
Ваше приложение не поддерживает управление версиями
Вы используете
addPersistentStoreWithType:configuration:URL:options:error:
непосредственно.Если по некоторым причинам модель координатора не совместима со схемой хранилища (т.е. объекты текущей модели хешей версии не равняются тем в метаданных хранилища), координатор обнаруживает это, генерирует ошибку, и
addPersistentStoreWithType:configuration:URL:options:error:
возвратыNO
. Необходимо иметь дело с этой ошибкой соответственно.Ваше приложение действительно поддерживает управление версиями, и Вы принимаете решение использовать или легкий вес или процесс миграции по умолчанию
Вы используете
addPersistentStoreWithType:configuration:URL:options:error:
как описано в Легкой Миграции и Процессе Миграции По умолчанию соответственно.Принципиальное различие от неимеющего версию подхода - то, что Вы даете координатору команду автоматически перемещать хранилище на версию текущей модели путем добавления записи в словарь опций, где ключ
NSMigratePersistentStoresAutomaticallyOption
и значениеNSNumber
представляющий объектYES
.Ваше приложение действительно поддерживает управление версиями, и Вы принимаете решение использовать пользовательскую начальную загрузку обнаружения и миграции скоса версии
Прежде, чем открыть хранилище Вы используете
isConfiguration:compatibleWithStoreMetadata:
проверять, совместима ли его схема с моделью координатора:Если это, Вы используете
addPersistentStoreWithType:configuration:URL:options:error:
открыть хранилище непосредственно;Если это не, необходимо мигрировать, хранилище сначала тогда открывают его (снова использование
addPersistentStoreWithType:configuration:URL:options:error:
).
Вы могли просто использовать
addPersistentStoreWithType:configuration:URL:options:error:
чтобы проверить, требуется ли миграция, однако это - тяжелая работа и неэффективный с этой целью.
Важно понять, что существует два ортогональных понятия:
Можно выполнить пользовательский код во время миграции.
У Вас может быть пользовательский код для начальной загрузки обнаружения и миграции скоса версии.
Классы миграционной политики позволяют Вам настраивать миграцию объектов и свойств многими способами, и они обычно - все, в чем Вы нуждаетесь. Вы могли бы, однако, использовать пользовательскую скошенную начальную загрузку обнаружения и миграции так, чтобы можно было взять под свой контроль процесс миграции. Например, если у Вас есть очень большие хранилища, Вы могли бы установить менеджера по миграции с этими двумя моделями данных, и затем использовать серию отображающихся моделей для миграции данных в целевое хранилище (при использовании того же целевого URL для каждого вызова Базовые Данные добавляют новые объекты к существующему хранилищу). Это позволяет платформе (и Вы) ограничивать объем данных в памяти во время процесса преобразования.
Процесс миграции по умолчанию
Чтобы открыть хранилище и выполнить миграцию (если необходимый), Вы используете addPersistentStoreWithType:configuration:URL:options:error:
и добавьте к словарю опций запись, где ключ NSMigratePersistentStoresAutomaticallyOption
и значение NSNumber
представляющий объект YES
. Ваш код выглядит подобным следующему примеру:
Перечисление 6-1 , Открывающееся хранилище с помощью автоматической миграции
NSError *error; |
NSPersistentStoreCoordinator *psc = <#The coordinator#>; |
NSURL *storeURL = <#The URL of a persistent store#>; |
NSDictionary *optionsDictionary = |
[NSDictionary dictionaryWithObject:[NSNumber numberWithBool:YES] |
forKey:NSMigratePersistentStoresAutomaticallyOption]; |
NSPersistentStore *store = [psc addPersistentStoreWithType:<#Store type#> |
configuration:<#Configuration or nil#> |
URL:storeURL |
options:optionsDictionary |
error:&error]; |
Если миграция продолжается успешно, существующее хранилище в storeURL
переименован с суффиксом «~» перед любым расширением файла и перемещенным хранилищем, сохраненным к storeURL
.
В его реализации addPersistentStoreWithType:configuration:URL:options:error:
Базовые Данные делают следующее:
Попытки найти модель управляемого объекта, которую это может использовать для открытия хранилища.
Базовые Данные перерывают ресурсы Вашего приложения для моделей и тестируют каждого поочередно. Если это не может найти подходящую модель, Базовые Данные возвращаются
nil
и подходящая ошибка.Попытки найти отображающуюся модель, отображающуюся от модели управляемого объекта для существующего хранилища к этому в использовании персистентным координатором хранилища.
Базовые Данные перерывают ресурсы Вашего приложения для доступных моделей отображения и тестируют каждого поочередно. Если это не может найти подходящее отображение, Базовые возвраты Данных
NO
и подходящая ошибка.Обратите внимание на то, что Вы, должно быть, создали подходящую модель отображения для этой фазы для следования.
Создает экземпляры объектов миграционной политики, требуемых отображающейся моделью.
Обратите внимание на то, что даже при использовании процесса миграции по умолчанию, можно настроить саму миграцию с помощью пользовательских классов миграционной политики.