Основные данные 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 Code = 134130
UserInfo = 0x1624d20 "Операция не может быть выполнена. (Cocoa ошибка 134130.)" 2009-12-01 20: 04: 22.879 Shoppee [25633: 207] Неразрешенная ошибка Ошибка домена = код NSCocoaErrorDomain = 134130 UserInfo = 0x1624d20 "Операция не может быть завершена. (Cocoa ошибка 134130.)", { URL = файл://localhost/Users/Eric/Library/Application%20Support/iPhone%20Simulator/User/Applications/A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documents/MyApp.sqlite; метаданные = { NSPsistenceFrameworkVersion = 241; NSStoreModelVersionHashes = { Item = < 869d4b20 088e5c44 5c345006 87d245cd 67ab9bc4 14cadf45 180251e9 f741a98f > ; Хранить = < 47c250f4 895e6fd1 5033ab42 22d2d493 7819ba75 3c0acffc 2dc54515 8deeed7a > ; }; NSStoreModelVersionHashesVersion = 3; NSStoreModelVersionIdentifiers = ( ); NSStoreType = SQLite; NSStoreUUID = "8DC65301-3BC5-42BE-80B8-E44577B8F8E1"; }; reason = "Невозможно найти модель для хранилища источников"; }
Похоже, мне нужно включить исходную модель данных, но я не уверен, как это сделать. Любые предложения?
Ответы
Ответ 1
Повторить/Полное руководство:
-
Перед внесением любых изменений создайте новую версию модели.
В Xcode 4: Выберите свой .xcdatamodel
→ Редактор → Добавить версию модели.
В Xcode 3: Дизайн → Модель данных → Добавить версию модели.
Вы увидите, что в папке .xcdatamodeld
создан новый .xcdatamodel
(который также создается, если у вас его нет).
-
Сохранить.
-
Выберите новый .xcdatamodel
и внесите изменения, которые вы хотите использовать в соответствии с документацией по облегченной миграции.
-
Сохранить.
-
Установите текущую/активную схему для вновь созданной схемы.
При выборе папки .xcdatamodeld
:
В Xcode 4: боковая панель Utilities → File Inspector → Versioned Core Data Model → Выберите новую схему.
В Xcode 3: Дизайн > Модель данных > Установить текущую версию.
Зеленый галочка на значке .xcdatamodel
переместится в новую схему.
-
Сохранить.
-
Внедрите необходимый код для выполнения миграции во время выполнения.
Если ваш NSPersistentStoreCoordinator
создан (обычно класс AppDelegate), для параметра options
замените nil
на следующий код:
[NSDictionary dictionaryWithObjectsAndKeys:
[NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption,
[NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
-
Запустите приложение. Если нет сбоя, вы, вероятно, успешно перенесли:)
-
После успешной миграции код миграции (шаг 7) можно удалить. (Разработчик должен определить, когда пользователи опубликованного приложения могут быть перенесены.)
ВАЖНО: Не удалять старые версии моделей/схемы. Core Data нуждается в старой версии для перехода на новую версию.
Ответ 2
Я понял это.
Дизайн > Модель данных > Добавить версию модели
Ответ 3
Для гуглеров снова это нужно сделать (если вы уже настроили облегченную миграцию):
- Перед внесением изменений Do Design → Data Model → Add Model Version (вы увидите, что новый
.xcdatamodel
создан в вашей папке .xcdatamodeld
)
- Сохранить
- Сделайте свое изменение
- Сохранить
- Запустить приложение
Шаг №1 имеет решающее значение для выполнения этой работы. Я столкнулся с этой проблемой, потому что я выполнил следующие шаги, чтобы добавить новое поле. Это сработало. Я добавил второе новое поле, но забыл "Добавить версию модели", и все взорвалось.
Ответ 4
Также для гуглеров. Простое правило, никогда не удаляйте и не редактируйте старую нумерованную версию. Когда вы добавляете версию модели, число суффикса будет увеличиваться как 2..3..4, что означает, что 2 является самым старым 3 следующего и т.д., Но текущий для редактирования - это ненумерованная версия.
Не удалять старые версии моделей, так как пользователи с предыдущим db с использованием старой версии модели не смогут перейти к вашей последней модели db без сравнения старых и последних схем.
Ответ 5
Просто примечание для тех, кто сталкивается с этим Google, кажется, что даже с автоматической (магической) миграцией вам все равно нужно создать версию своего оригинального магазина, а новую - и установить новую в качестве текущей версии.
Ответ 6
Пока я вижу только, как избежать сообщения об ошибке.
Но как мы это исправим - на случай, если мы все испортили?
Следующее решение устранило проблему, но вы потеряете данные в БД:
Удалить/переименовать sqlite файл развернутого/установленного приложения.
Имя файла указывается непосредственно после сообщения об ошибке. например:.
reason = Не удается найти модель для хранилища источников}, {
URL= "файл://localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/Documents/Locations.sqlite";
Ответ 7
Что-то нужно иметь в виду при легкой миграции -
Если вы планируете переименовывать/изменять атрибуты, не забудьте установить значение "Renaming ID" в новой или старой модели. Чтобы использовать собственный пример Apple, в XCode 4.3 выберите paintColor в новой модели > перейдите к Data Model Inspector > Установите для поля "Переименование идентификатора" значение "Цвет" в разделе "Версии". Для меня отказ выполнить этот шаг привел к ошибке времени выполнения. Эта же ошибка также относится к . Как новый пользователь, мне не разрешено размещать изображения, поэтому здесь ссылка imgur (не спам, действительно).
(Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration
Ответ 8
Вы также можете получить эту ошибку при внесении изменений в модель данных и запуске на установленном приложении с другой версией файла sqlite. В этом случае просто удалите установленное приложение и запустите его.
Ответ 9
На всякий случай кто-то сталкивается с этим сценарием, и ни одно из вышеприведенных действий не работает... Я удалял свое приложение из симулятора, чистил и т.д., но ничего не получилось. Мне пришлось пойти в каталог симулятора и вручную запустить файл .sqlite, чтобы приложение снова работало. Нет подсказки...