Настройка процесса миграции
Если Вы хотите инициировать миграцию сами, Вы только настраиваете процесс миграции. Вы могли бы сделать это к, например, чтобы искать модели в расположениях кроме основного пакета приложения или иметь дело с большими наборами данных путем выполнения миграции в нескольких передачах с помощью различных моделей отображения (см. Многократные Передачи — Контакт С Большими Наборами данных).
Необходимая миграция
Перед инициированием процесса миграции необходимо сначала определить, необходимо ли это. Можно свериться NSManagedObjectModel
isConfiguration:compatibleWithStoreMetadata:
как проиллюстрировано в Перечислении 7-1.
Перечисление 7-1 , Проверяющее, необходима ли миграция
NSPersistentStoreCoordinator *psc = /* get a coordinator */ ; |
NSString *sourceStoreType = /* type for the source store, or nil if not known */ ; |
NSURL *sourceStoreURL = /* URL for the source store */ ; |
NSError *error = nil; |
NSDictionary *sourceMetadata = |
[NSPersistentStoreCoordinator metadataForPersistentStoreOfType:sourceStoreType |
URL:sourceStoreURL |
error:&error]; |
if (sourceMetadata == nil) { |
// deal with error |
} |
NSString *configuration = /* name of configuration, or nil */ ; |
NSManagedObjectModel *destinationModel = [psc managedObjectModel]; |
BOOL pscCompatibile = [destinationModel |
isConfiguration:configuration |
compatibleWithStoreMetadata:sourceMetadata]; |
if (pscCompatibile) { |
// no need to migrate |
} |
Инициализация менеджера по миграции
Вы инициализируете менеджера по миграции, использующего initWithSourceModel:destinationModel:
; Вы поэтому первая потребность найти надлежащую модель для хранилища. Вы получаете модель для использования хранилища NSManagedObjectModel
mergedModelFromBundles:forStoreMetadata:
. Если это возвращает подходящую модель, можно создать менеджера по миграции, как проиллюстрировано в Перечислении 7-2 (этот фрагмент кода продолжается от Перечисления 7-1).
Перечисление 7-2 , инициализирующее менеджера по миграции
NSArray *bundlesForSourceModel = /* an array of bundles, or nil for the main bundle */ ; |
NSManagedObjectModel *sourceModel = |
[NSManagedObjectModel mergedModelFromBundles:bundlesForSourceModel |
forStoreMetadata:sourceMetadata]; |
if (sourceModel == nil) { |
// deal with error |
} |
MyMigrationManager *migrationManager = |
[[MyMigrationManager alloc] |
initWithSourceModel:sourceModel |
destinationModel:destinationModel]; |
Выполнение миграции
Вы перемещаете использование хранилища NSMigrationManager
migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:
. Для использования этого метода, необходимо упорядочить много параметров; большинство прямо, требующее единственное, некоторая работа является открытием надлежащей модели отображения (который можно получить использование NSMappingModel
mappingModelFromBundles:forSourceModel:destinationModel:
метод). Это проиллюстрировано в Перечислении 7-3 (продолжение примера, показанного в Перечислении 7-2).
Перечисление 7-3 , выполняющее миграцию
NSArray *bundlesForMappingModel = /* an array of bundles, or nil for the main bundle */ ; |
NSError *error = nil; |
NSMappingModel *mappingModel = |
[NSMappingModel |
mappingModelFromBundles:bundlesForMappingModel |
forSourceModel:sourceModel |
destinationModel:destinationModel]; |
if (mappingModel == nil) { |
// deal with the error |
} |
NSDictionary *sourceStoreOptions = /* options for the source store */ ; |
NSURL *destinationStoreURL = /* URL for the destination store */ ; |
NSString *destinationStoreType = /* type for the destination store */ ; |
NSDictionary *destinationStoreOptions = /* options for the destination store */ ; |
BOOL ok = [migrationManager migrateStoreFromURL:sourceStoreURL |
type:sourceStoreType |
options:sourceStoreOptions |
withMappingModel:mappingModel |
toDestinationURL:destinationStoreURL |
destinationType:destinationStoreType |
destinationOptions:destinationStoreOptions |
error:&error]; |
Многократные передачи — контакт с большими наборами данных
Основной подход, показанный выше, должен сделать, чтобы менеджер по миграции взял две модели, и затем выполнил итерации по шагам (отображения), предоставленные в отображающейся модели для перемещения данных с одной стороны до следующего. Поскольку Базовые Данные выполняют «три этапа» миграция — где это создает все данные сначала, и затем связывает данные на втором этапе — это должно поддержать “таблицы ассоциации» (которые говорят его, какой объект в целевом хранилище является перемещенной версией, которой возражают в исходном хранилище, и наоборот). Далее, потому что это не имеет средних значений для сбрасывания контекстов, с которыми это работает, это означает накопление многих объектов в менеджере по миграции, в то время как развивается миграция.
Для обращения этого отображающаяся модель дана как параметр migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:
вызовите себя. То, что это означает, - то, что, если можно выделять части графика (насколько отображения затронуты) и создают их в отдельных моделях отображения, Вы могли сделать следующее:
Получите источник и целевые модели данных
Создайте менеджера по миграции с ними
Найдите все свои модели отображения и поместите их в массив (в некотором определенном порядке, если необходимый)
Цикл через массив и вызов
migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error:
с каждым из отображений
Это позволяет Вам перемещать «блоки» данных за один раз, не вытягивая во всех данных сразу.
От «прогресса отслеживания/показа” точка зрения, в основном просто создающая другой уровень для работы от, таким образом, Вы были бы в состоянии определить процент, завершенный на основе числа отображающихся моделей для итерации через (и затем далее на числе отображений объекта в модели Вы уже прошли через).