Как перейти с автоматической облегченной миграции Core Data на ручную? - PullRequest
0 голосов
/ 16 апреля 2010

Моя ситуация похожа на этот вопрос. Я использую облегченную миграцию со следующим кодом, довольно ванильно из документов Apple и других SO-потоков. Он запускается при запуске приложения при инициализации стека основных данных.

NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
    [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
    [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption,
    nil];

NSError *error = nil;

NSString *storeType = nil;
if (USE_SQLITE) { // app configuration
    storeType = NSSQLiteStoreType;
} else {
    storeType = NSBinaryStoreType;
}

persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];

// the following line sometimes crashes on app startup
if (![persistentStoreCoordinator addPersistentStoreWithType:storeType configuration:nil URL:[self persistentStoreURL] options:options error:&error]) {
    // handle the error
}

Для некоторых пользователей, особенно с более медленными устройствами, сбои подтверждаются журналами в указанной строке.

Я понимаю, что исправление состоит в том, чтобы переключить это на ручное отображение и миграцию. Какой рецепт для этого? Долгий путь для меня - просмотреть все документы Apple, но я не помню, чтобы были хорошие примеры и учебные пособия, специально предназначенные для миграции схем.

1 Ответ

3 голосов
/ 16 апреля 2010

Есть хорошие примеры того, как выполнить миграцию вручную, но основные шаги:

  • создать модель отображения
  • включить эту модель картирования в ваш проект
  • отключить автоматическую миграцию

Однако, что такое сбой? Вас убивает ОС за то, что вы слишком долго? Как ручная миграция не вылечит это.

Какой тип бэк-магазина вы используете? Если вы используете двоичный файл, возможно, что объем памяти израсходуется, поскольку при миграции в памяти будет две копии всей базы .

обновление от комментария OP

Я думаю, что я видел, что это также происходит с SQLite, так что, возможно, есть что-то большее, чем память, хотя это верный момент. Да, ОС убивает его за то, что он занимает слишком много времени, особенно на устройствах 1G. Я подумал, что ручная миграция - это также способ перейти от «миграции при запуске приложения с ограничениями по времени» к чему-то без ограничений по времени, и сделать это, возможно, в фоновом потоке или тому подобное.

Нет способа выполнить миграцию в фоновом потоке, потому что вы меняете источник данных. Если ваша миграция занимает слишком много времени при запуске, то рекомендуемое решение:

  • Позвольте циклу -applicationDidFinishLaunching: завершить цикл выполнения, не затрагивая основные данные. Это остановит этот сбой
  • Начните миграцию на следующей итерации в цикле выполнения (вероятно, хотите представить пользователю какой-то индикатор прогресса) и завершите миграцию.

Если вы используете бинарное хранилище, у вас, вероятно, все еще будут проблемы с памятью, но это решит ваш сбой при запуске. Крах ОС - это сообщение «Я думаю, что вы заблокированы». Позволяя завершить -applicationDidFinishLaunching:, вы сообщаете ОС, что вы не заблокированы.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...