2010-02-17 3 views
11

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

/** 
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, предполагает, с помощью опции меню «Добавить модель Version».

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

ответ

27

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

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

+0

Это замечательно! Спасибо! – charlax

+0

Уборка не обязательно устраняет проблему. Xcode не удаляет старые файлы ресурсов из установленных приложений даже после чистой сборки. Использование initWithContentsOfURL вместо mergedModelFromBundles по крайней мере уменьшает проблему только до старых файлов .mom в одной папке. (Я просто боролся с этой проблемой в течение нескольких дней: http://stackoverflow.com/a/13146888/1017650) – Symmetric

4

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

+0

Я получаю «Завершение приложения из-за неперехваченного исключения» NSInvalidArgumentException », причина:« Невозможно создать NSPsistentStoreCoordinator с нулевой моделью »(правильный URL-адрес файла). Эта ошибка происходит в: 'persistentStoreCoordinator = [[NSPersistentStoreCoordinator Alloc] initWithManagedObjectModel: [само managedObjectModel]];' – charlax

+0

Там нет необходимости * * переключиться на initWithContentsOfURL :. Проблема заключается в ответе Маркуса, что ваш продукт сборки по-прежнему содержит старую модель. Это будет исправлено, если вы просто сделаете чистую уборку. Использование initWithContentsOfURL: работает, потому что теперь вы не собираете старую модель. – mmalc

+0

На самом деле, существует необходимость, так как Xcode не удаляет старые файлы ресурсов (см. Мой комментарий к ответу @Marcus). – Symmetric

0

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

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

Смотрите этот другой переполнением стека тему для получения дополнительной информации: Using mergedModelFromBundles: and versioning (CoreData)

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

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

9

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

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

+0

ура отлично работает для меня – Abolfoooud

+0

Даже после 6 лет платного iOS-разработчика я никогда не знал эту ошибку xcode. Все еще присутствует в Xcode 6. Спасибо, кучи! – Tim

2

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

0

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

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

FYI!

0

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

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

0

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