Использование mergedModelFromBundles: и управление версиями (CoreData) - PullRequest
11 голосов
/ 17 февраля 2010

Я пытаюсь использовать функцию миграции в 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, с помощью пункта меню «Добавить версию модели».

У вас есть идеи?

Ответы [ 8 ]

28 голосов
/ 17 февраля 2010

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

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

9 голосов
/ 25 марта 2010

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

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

4 голосов
/ 17 февраля 2010

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

2 голосов
/ 28 января 2011

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

0 голосов
/ 11 сентября 2015

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

0 голосов
/ 20 марта 2012

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

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

0 голосов
/ 15 мая 2011

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

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

FYI!

0 голосов
/ 28 февраля 2010

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

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

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

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

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

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