Настройка процесса миграции

Если Вы хотите инициировать миграцию сами, Вы только настраиваете процесс миграции. Вы могли бы сделать это к, например, чтобы искать модели в расположениях кроме основного пакета приложения или иметь дело с большими наборами данных путем выполнения миграции в нескольких передачах с помощью различных моделей отображения (см. Многократные Передачи — Контакт С Большими Наборами данных).

Необходимая миграция

Перед инициированием процесса миграции необходимо сначала определить, необходимо ли это. Можно свериться 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: вызовите себя. То, что это означает, - то, что, если можно выделять части графика (насколько отображения затронуты) и создают их в отдельных моделях отображения, Вы могли сделать следующее:

  1. Получите источник и целевые модели данных

  2. Создайте менеджера по миграции с ними

  3. Найдите все свои модели отображения и поместите их в массив (в некотором определенном порядке, если необходимый)

  4. Цикл через массив и вызов migrateStoreFromURL:type:options:withMappingModel:toDestinationURL:destinationType:destinationOptions:error: с каждым из отображений

Это позволяет Вам перемещать «блоки» данных за один раз, не вытягивая во всех данных сразу.

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