Использование 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, используя пункт меню "Добавить модель".
Есть ли у вас какие-либо идеи?
8 ответов
Вы должны очистить свой проект. Как только вы "версии", ваша модель Xcode перемещает ее в пакет (папку), но она не удаляет старую. Затем происходит следующее: при следующем запуске приложения в комплекте будет две копии вашей модели; старый и новый, который находится внутри комплекта momd.
Выполнение проекта -> Очистить все решит эту проблему.
Кроме того, если вы переименуете свои модели в любой момент, убедитесь, что вы повторили шаг "установить текущую модель", переключившись на более старую, а затем снова на более новую модель. Мои настройки сборки не сбрасывались автоматически и продолжали устанавливать "имя текущей модели" на несуществующую модель, что приводило к точно такой же проблеме.
Вы всегда можете проверить правильность этого параметра в папке ресурсов продукта сборки, в импортированном каталоге.momd, в файле с именем versioninfo.plist - настройки для текущей модели ДОЛЖНЫ совпадать с реальным именем вашей модели.
Я обнаружил, что использование mergedModelFromBundel: метод, похоже, не работает с миграцией; Я переключился на -initWithContentsOfURL: и он работает нормально. Обратите внимание, что вы должны начать его с URL-адреса, указывающего на файл ".momd".
Если вы в любой момент измените модель данных, обязательно сбросьте содержимое и настройки в симуляторе, иначе вы получите ошибку, что версия модели, используемой для создания хранилища, не совпадает с моделью, используемой для доступа к ней.
К сожалению для меня, это не было проблемой очистки или управления версиями. У меня есть несколько сложный проект с несколькими слоями вложенных проектов 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, но я был сумасшедшим ошибка указана в исходном вопросе. Я изменил свое местоположение на "Относительно группы", и он начал работать. Я еще не нашел точную причину этого, но это потратило большую часть дня на расследование. Надеюсь, это поможет кому-то еще в будущем.
Спасибо всем!
Все это работало, но только после того, как я использовал опцию Чистая сборка.
См. Эту другую тему переполнения стека для получения дополнительной информации: Использование mergedModelFromBundles: и управление версиями (CoreData)
IPhone Core Data Reference имеет довольно приличное описание этого. Формальный процесс из документации - "Автоматическая легкая миграция".
Еще раз спасибо, - Батгар
Сначала ни один из упомянутых методов не работал для меня. Я использую XCode 4. Выполнен Clean, Clean Build Folder, расположенный.app-файл, чтобы проверить, что там нет другого файла.xcdatamodel, кроме правильного (содержащего как старые, так и новые версии). Пытался использовать initWithContentsOfURL:. Проверил, что текущая версия соответствует правильной, и сделал сброс содержимого и настроек на симуляторе. Затем отредактировал VersionInfo.plist и обнаружил, что значение NSManagedObjectModel_CurrentVersionName соответствует несуществующему имени версии!
Поэтому сбросьте имя текущей версии для какой-либо существующей модели (вы увидите, что зеленая галочка меняется), перестроите, и это сработало.
FYI!
Я начал получать сбои для [[NSManagedObjectModel mergedModelFromBundles:nil]
также без сообщения об ошибке (типичные данные ядра). В конце концов я решил эту проблему, осознав, что я назвал две сущности в разных моделях с одинаковым именем. Вот почему это было сбой для меня. Изменение имен остановило его сбой.