Основные данные 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 ответов

Решение

Напомним / полное руководство:

  1. Прежде чем вносить какие-либо изменения, создайте новую версию модели.

    В Xcode 4: выберите ваш .xcdatamodel -> Редактор -> Добавить версию модели.

    В Xcode 3: Проектирование -> Модель данных -> Добавить версию модели.

    Вы увидите, что новый .xcdatamodel создан в вашем .xcdatamodeld папка (которая также создается, если у вас ее нет).

  2. Сохранить.

  3. Выберите свой новый .xcdatamodel и внесите необходимые изменения в соответствии с документацией об упрощенной миграции.

  4. Сохранить.

  5. Установите текущую / активную схему для вновь созданной схемы.

    С .xcdatamodeld выбранная папка:

    В Xcode 4: боковая панель Утилиты -> Инспектор Файлов -> Версионная Базовая Модель Данных -> Выберите новую схему.

    В Xcode 3: Дизайн> Модель данных> Установить текущую версию.

    Зеленая галочка на .xcdatamodel значок переместится в новую схему.

  6. Сохранить.

  7. Реализуйте необходимый код для выполнения миграции во время выполнения.

    Где твой NSPersistentStoreCoordinator создается (обычно класс AppDelegate), для options параметр, заменить nil со следующим кодом:

    [NSDictionary dictionaryWithObjectsAndKeys:
                      [NSNumber numberWithBool:YES], NSMigratePersistentStoresAutomaticallyOption, 
                      [NSNumber numberWithBool:YES], NSInferMappingModelAutomaticallyOption, nil]
    
  8. Запустите ваше приложение. Если нет сбоев, вы, вероятно, успешно мигрировали:)

  9. После успешной миграции код миграции (шаг 7) можно удалить. (Разработчик должен определить, когда пользователи опубликованного приложения могут считаться перенесенными.)

ВАЖНО: Не удаляйте старые версии / схемы моделей. Базовым данным нужна старая версия для перехода на новую версию.

Я понял.

Дизайн> Модель данных> Добавить версию модели

Опять же, для Google, это то, что вам нужно сделать (при условии, что вы уже настроили облегченную миграцию):

  1. Прежде чем вносить изменения, выполните Дизайн -> Модель данных -> Добавить версию модели (вы увидите, что новый .xcdatamodel создан в вашем .xcdatamodeld папка)
  2. Сохранить
  3. Внести изменения
  4. Сохранить
  5. Запустить приложение

Шаг № 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, чтобы приложение снова заработало. Понятия не имею...

Другие вопросы по тегам