Основные данные 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, чтобы приложение снова работало. Нет подсказки...