Основные данные iPhone "Автоматическая легкая миграция"
Я пытаюсь обновить приложение, которое реализует основное хранилище данных. Я добавляю атрибут к одной из сущностей.
Я добавил следующий код в мой класс делегата:
- (NSPersistentStoreCoordinator *)persistentStoreCoordinator {
if (persistentStoreCoordinator != nil) {
return persistentStoreCoordinator;
}
NSURL *storeUrl = [NSURL fileURLWithPath: [[self applicationDocumentsDirectory] stringByAppendingPathComponent: @"Shoppee.sqlite"]];
NSError *error = nil;
persistentStoreCoordinator = [[NSPersistentStoreCoordinator alloc] initWithManagedObjectModel:[self managedObjectModel]];
NSDictionary *options = [NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil];
if (![persistentStoreCoordinator addPersistentStoreWithType:NSSQLiteStoreType configuration:nil URL:storeUrl options:options error:&error]) {
NSLog(@"Error: %@",error);
NSLog(@"Unresolved error %@, %@", error, [error userInfo]);
abort();
}
return persistentStoreCoordinator;
}
Это было со следующего URL: Doc
Я получаю следующую ошибку при выполнении кода:
2009-12-01 20: 04: 22.877
Shoppee [25633: 207] Ошибка: ошибка
Домен =NSCocoaErrorDomain Код = 134130
UserInfo = 0x1624d20 "Операция не может быть завершена. (Ошибка Какао 134130.)" 2009-12-01 20:04:22.879 Shoppee[25633:207] Неразрешенная ошибка Ошибка Domain=NSCocoaErrorDomain Code=134130 UserInfo=0x1624d20 "Операция не может быть выполнена завершено. (ошибка Какао 134130.)", { URL = файл://localhost/ Пользователи / Эрик / Библиотека / Приложение%20Support/iPhone%20Simulator/ Пользователь / Приложения /A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documents/MyApp.sqlite; метаданные = { NSPersistenceFrameworkVersion = 241; NSStoreModelVersionHashes = { Item = <869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45 180251e9 f741a98f>; Store = <47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc 2dc54515 8deeed7a>; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = (); NSStoreType = SQLite; NSStoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1"; }; reason = "Не могу найти модель для исходного магазина"; }
Похоже, мне нужно как-то включить исходную модель данных, но я не уверен, как это сделать. Какие-либо предложения?
9 ответов
Напомним / полное руководство:
Прежде чем вносить какие-либо изменения, создайте новую версию модели.
В Xcode 4: выберите ваш
.xcdatamodel
-> Редактор -> Добавить версию модели.В Xcode 3: Проектирование -> Модель данных -> Добавить версию модели.
Вы увидите, что новый
.xcdatamodel
создан в вашем.xcdatamodeld
папка (которая также создается, если у вас ее нет).Сохранить.
Выберите свой новый
.xcdatamodel
и внесите необходимые изменения в соответствии с документацией об упрощенной миграции.Сохранить.
Установите текущую / активную схему для вновь созданной схемы.
С
.xcdatamodeld
выбранная папка:В Xcode 4: боковая панель Утилиты -> Инспектор Файлов -> Версионная Базовая Модель Данных -> Выберите новую схему.
В Xcode 3: Дизайн> Модель данных> Установить текущую версию.
Зеленая галочка на
.xcdatamodel
значок переместится в новую схему.Сохранить.
Реализуйте необходимый код для выполнения миграции во время выполнения.
Где твой
NSPersistentStoreCoordinator
создается (обычно класс AppDelegate), дляoptions
параметр, заменитьnil
со следующим кодом:[NSDictionary dictionaryWithObjectsAndKeys: [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
Запустите ваше приложение. Если нет сбоев, вы, вероятно, успешно мигрировали:)
После успешной миграции код миграции (шаг 7) можно удалить. (Разработчик должен определить, когда пользователи опубликованного приложения могут считаться перенесенными.)
ВАЖНО: Не удаляйте старые версии / схемы моделей. Базовым данным нужна старая версия для перехода на новую версию.
Опять же, для Google, это то, что вам нужно сделать (при условии, что вы уже настроили облегченную миграцию):
- Прежде чем вносить изменения, выполните Дизайн -> Модель данных -> Добавить версию модели (вы увидите, что новый
.xcdatamodel
создан в вашем.xcdatamodeld
папка) - Сохранить
- Внести изменения
- Сохранить
- Запустить приложение
Шаг № 1 имеет решающее значение для выполнения этой работы. Я столкнулся с этой проблемой, потому что я следовал этим шагам, чтобы добавить новое поле. Это сработало. Я добавил второе новое поле, но забыл "Добавить версию модели", и все взорвалось.
Также для googlers.. Простое правило, никогда не удаляйте / редактируйте старую нумерованную версию. При добавлении версии модели числовой суффикс будет увеличиваться до 2..3..4, означая, что 2 является самым старым 3 следующим и т. Д., Но текущим для редактирования является ненумерованная версия.
Не удаляйте старые версии модели, поскольку пользователи с предыдущей базой данных, использующей старую версию модели, не смогут перейти на вашу последнюю модель базы данных, не сравнивая старую и последнюю схемы.
Просто замечание для тех, кто сталкивается с этим поиском в Google, кажется, что даже при автоматической (волшебной) миграции вам все равно нужно создать версию своего оригинального магазина и новую, и установить новую в качестве текущей версии.
Что нужно иметь в виду при выполнении облегченной миграции -
Если вы планируете переименовывать / изменять атрибуты, не забудьте установить значение "Renaming ID" в новой или старой модели. Чтобы использовать собственный пример Apple, в XCode 4.3 выберите paintColor в новой модели> переключитесь на инспектор модели данных> Установите для поля "Переименование идентификатора" значение "Цвет" в разделе "Управление версиями". Для меня, неспособность сделать этот шаг привел к ошибке во время выполнения. Эта же ошибка также рассматривается здесь. Как новый пользователь, я не могу публиковать изображения, так что вот ссылка imgur (на самом деле не спам).
(Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration
Пока я вижу только, как избежать сообщения об ошибке.
Но как мы можем это исправить - если мы уже все испортили?
Следующее решение решило проблему, но вы потеряете данные в БД:
Удалите / переименуйте файл sqlite развернутого / установленного приложения.
Файлы с указанием местоположения даются сразу после сообщения об ошибке. например:
reason = Не могу найти модель для исходного магазина}, {
URL = "file: //localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/Documents/Locations.sqlite";
Вы также можете получить эту ошибку, когда вносите изменения в модель данных и работаете в установленном приложении с другой версией файла sqlite. В этом случае просто удалите установленное приложение и перезапустите его.
На всякий случай, если кто-то столкнется с этим сценарием, и ничего из вышеперечисленного не сработает... Я удалял свое приложение из симулятора, чистил и т. Д., Но ничего не получалось. Мне пришлось перейти в каталог симулятора и вручную запустить файл.sqlite, чтобы приложение снова заработало. Понятия не имею...