Подтвердить что ты не робот

Использование mergedModelFromBundles: и управление версиями (CoreData)

Я пытаюсь использовать функцию миграции в CoreData. Я следил за документацией Apple. У меня проблема в следующем методе:

/**
 Returns the managed object model for the application.
 If the model doesn't already exist, it is created by merging all of the models found in the application bundle.
 */
- (NSManagedObjectModel *)managedObjectModel {

    if (managedObjectModel != nil) {
        return managedObjectModel;
    }
    /* 
     * NSInvalidArgumentException', reason: '*** -[NSCFArray insertObject:atIndex:]: attempt to insert nil'
     * 2010-02-17 16:27:15.338 Patrimoine[3037:207]
     */ 
    managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];    
    return managedObjectModel;
}

Похоже, что существует такая же проблема на http://iphonedevelopment.blogspot.com/2009/09/core-data-migration-problems.html

Однако я выбрал метод, который предлагает Apple, используя опцию меню "Добавить версию модели".

Есть ли у вас идеи?

4b9b3361

Ответ 1

Вам нужно очистить проект. Как только вы "версия", ваша модель Xcode перемещает ее в пакет (папку), но не удаляет старый. Затем происходит следующее: при следующем запуске приложения в комплекте есть две копии вашей модели; старый и новый, который находится внутри пакета momd.

Выполнение проекта → Очистить все, разрешит эту проблему.

Ответ 2

Кроме того, если вы переименуете свои модели в любой момент, обязательно и повторите шаг "установить текущую модель", снова переключившись на более старую, а затем обратно на новую модель. Моя настройка сборки не была бы автоматически reset и продолжала устанавливать "текущее имя модели" на несуществующую модель, в результате чего была бы точно такая же проблема.

Вы всегда можете проверить правильность этого параметра в папке с ресурсами продукта сборки внутри импортированного каталога .momd в файле с именем versioninfo.plist - параметр для текущей модели ДОЛЖЕН соответствовать фактическому имени вашей модели.

Ответ 3

Я обнаружил, что использование метода mergedModelFromBundel: похоже, не работает с миграцией; Я переключился на -initWithContentsOfURL:, и он отлично работает. Обратите внимание, что вы должны запустить его с URL-адресом, указывающим на файл ".momd".

Ответ 4

Если вы измените свою модель данных в любой момент, обязательно убедитесь, что Reset Содержимое и параметры в симуляторе, или вы получите сообщение об ошибке, что версия модели, используемая для создания магазина, не совпадает с моделью используется для доступа к нему.

Ответ 5

Спасибо всем!

Все это сработало, но только после того, как я использовал опцию Clean build.

См. другую тему для получения дополнительной информации: Использование mergedModelFromBundles: и управление версиями (CoreData)

Справочник по данным Core Core iPhone имеет довольно приличную запись. Формальный процесс из документации - это "Автоматическая легкая миграция".

Еще раз спасибо, --Batgar

Ответ 6

Сначала ни один из упомянутых методов не работал у меня. Я использую XCode 4. Выполненная чистая, чистая папка сборки, расположена в файле .app, чтобы там не было другого файла .xcdatamodel, кроме правильного (содержащего как старые, так и новые версии). Пытался использовать initWithContentsOfURL:. Проверьте, соответствует ли текущая версия правильной, и Reset Содержимое и настройки на симуляторе. Затем отредактировал файл VersionInfo.plist и обнаружил, что значение NSManagedObjectModel_CurrentVersionName соответствует несуществующей версии!

Итак, Reset текущее имя версии для какой-либо существующей модели (вы видите зеленое изменение галочки), перестроено и оно сработало.

FYI!

Ответ 7

К сожалению, для меня это не проблема очистки или управления версиями. У меня есть несколько сложный проект с несколькими слоями вложенных проектов Xcode. Чтобы справиться с проблемой каждого проекта, находящегося в другом репозитории SVN, я настраивал пути к моим проектам относительно некоторых конкретных деревьев-источников, которые я установил в "Предпочтениях → Местоположениях" Xcode. Например, я установил FACEBOOK_IOS_SDK_SRC, чтобы указать "~/Documents/{my_crazy_folder_structure}/facebook-ios-sdk/src". Таким образом, когда мои коллеги проверяют мой проект, расположение SDK для Facebook зависит от того, какой путь он настроил и не должен быть в той же структуре на своих машинах, что и на моем. Я знаю, что есть лучшие способы справиться с этим, но сейчас он работает.

В любом случае, моя проблема возникла, потому что в какой-то момент у меня было расположение файла *.xcdatamodel как "Относительно {source_tree_path}", который нашел файл просто прекрасным и даже скомпилировал его в файл *.mom, но я был получив эту сумасшедшую ошибку, указанную в первоначальном вопросе. Я изменил свое местоположение на "Относительно группы" и начал работать. Я пока не нашел точной причины для этого, но он потратил впустую большую часть дневного расследования. Надеюсь, это поможет кому-то еще в будущем.

Ответ 8

Я начал получать сбои для [[NSManagedObjectModel mergedModelFromBundles:nil], а также без сообщения об ошибке (типичные основные данные). В конце концов я решил это, осознав, что я назвал два объекта в разных моделях с тем же именем. Вот почему он рушился для меня. Изменение имен остановило его сбой.