Основные данные iPhone "Автоматическая легкая миграция" - PullRequest
64 голосов
/ 02 декабря 2009

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

Я добавил следующий код в свой класс делегатов:

- (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] Неразрешенная ошибка Домен ошибки = NSCocoaErrorDomain код = 134130 UserInfo = 0x1624d20 "Операция не может быть завершена. (Ошибка какао 134130.)", { URL = файл: //localhost/Users/Eric/Library/Application%20Support/iPhone%20Simulator/User/Applications/A8A8FB73-9AB9-4EB7-8F83-82F5B4467AF1/Documents/MyApp.sqlite; метаданные = { NSPersistenceFrameworkVersion = 241; NSStoreModelVersionHashes = { Элемент = <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 ]

143 голосов
/ 03 декабря 2011

Подводя итог / Полное руководство:

  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) можно удалить. (Разработчик должен определить, когда пользователи опубликованного приложения могут считаться мигрировавшими.)

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

26 голосов
/ 02 декабря 2009

Я понял это.

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

15 голосов
/ 28 июня 2010

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

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

Шаг № 1 имеет решающее значение для выполнения этой работы. Я столкнулся с этой проблемой, потому что я следовал этим шагам, чтобы добавить новое поле. Это сработало. Я добавил второе новое поле, но забыл «Добавить версию модели», и все взорвалось.

11 голосов
/ 18 января 2010

Также для googlers .. Простое правило, никогда не удаляйте / редактируйте старую нумерованную версию. При добавлении версии модели числовой суффикс будет увеличиваться до 2..3..4, означая, что 2 является самым старым 3 следующим и т. Д., Но текущим для редактирования является ненумерованная версия.

Не удаляйте старые версии модели, поскольку пользователи с предыдущей БД, использующей старую версию модели, не смогут перейти на вашу последнюю модель БД, не сравнивая старую и последнюю схемы.

5 голосов
/ 08 декабря 2009

Просто замечание для тех, кто сталкивается с этим поиском в Google, кажется, что даже при автоматической (волшебной) миграции вам все равно нужно создать версию своего оригинального магазина и новую, и установить новую в качестве текущей версии.

1 голос
/ 03 февраля 2013

Что нужно учитывать при выполнении облегченной миграции -

Если вы планируете переименовывать / изменять атрибуты, не забудьте установить значение «Renaming ID» в новой или старой модели. Чтобы использовать собственный пример Apple, в XCode 4.3 выберите paintColor в новой модели> переключитесь на инспектор модели данных> Установите для поля «Переименование идентификатора» значение «Цвет» в разделе «Управление версиями». Для меня, неспособность сделать этот шаг привел к ошибке во время выполнения. Эта та же самая ошибка также покрыта здесь . Как новый пользователь, я не могу публиковать изображения, поэтому вот ссылка imgur (на самом деле не спам).

    (Cocoa error 134140.)" UserInfo=0x622b350 {reason=Can't find or automatically infer mapping model for migration
1 голос
/ 01 августа 2012

Пока я вижу только, как избежать сообщения об ошибке.

Но как нам это исправить - если мы уже все испортили?

Следующее решение решило проблему, но вы потеряете данные в БД:

Удалить / переименовать файл sqlite развернутого / установленного приложения.
Файлы с именем местоположения даются сразу после сообщения об ошибке. e.g.:

reason = Не удалось найти модель для исходного магазина}, {
URL = "file: //localhost/Users/yourName/Library/Application%20Support/iPhone%20Simulator/4.3/Applications/62F342D4-F007-4F6F-96D2-68F902D3719A/Documents/Locations.sqlite;

0 голосов
/ 22 марта 2013

Вы также можете получить эту ошибку, когда вносите изменения в модель данных и работаете в установленном приложении с другой версией файла sqlite. В этом случае просто удалите установленное приложение и перезапустите его.

0 голосов
/ 19 июня 2012

На всякий случай, если кто-то столкнется с этим сценарием и ничего из вышеперечисленного не сработает ... Я удалял свое приложение из симулятора, чистил и т. Д., Но ничего не получалось. Мне пришлось перейти в каталог симулятора и вручную запустить файл .sqlite, чтобы приложение снова заработало. Понятия не имею ...

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