NSEntityDescription entityForName, возвращающее ноль - PullRequest
3 голосов
/ 13 июня 2010

Я внес некоторые изменения в свою модель (но пока не хочу переносить, поэтому я просто удаляю приложение, собираю его и т. Д.)

Однако, когда я запускаю его на iPhone или в симуляторе, я получаю следующую ошибку:

*** Завершение работы приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «executeFetchRequest: ошибка: запрос на выборку должен иметь сущность.»

Я установил сущность так:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"Document" inManagedObjectContext:managedObjectContext];

Мой managedObjectContext не ноль. Но я подозреваю, что он не загружает объектную модель правильно или что-то подобное, потому что, если я отображаю объекты в модели, список будет пуст:

managedObjectModel = [[NSManagedObjectModel mergedModelFromBundles:nil] retain];
NSLog(@"%d", [[managedObjectModel entities] count]);

Как я могу убедиться, что модель загружена?

Ответы [ 7 ]

6 голосов
/ 09 ноября 2010

У меня возникла такая же проблема. Как было предложено в комментарии TechZen, исправление для меня заключалось в том, чтобы щелкнуть правой кнопкой мыши файл в Xcode 3.x, выбрать «Получить информацию», а затем поставить галочку в соответствующем поле на вкладке «Цели».

UPDATE: В Xcode 4 пункт меню «Get Info» был удален. Вместо этого вы можете определить «Целевое членство» для файлов на правой боковой панели.

6 голосов
/ 13 июня 2010

Где вы «отображаете сущности»?Если они не отображаются в редакторе моделей данных, их там нет.

Вы можете использовать -[NSManagedObjectModel entities], чтобы получить массив объектов, которые есть в модели.

В свою очередь, вы можете использовать -[NSPersistentStore managedObjectModel], чтобы увидеть, какая модель загружена, а затем запросить ее сущности.

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

1 голос
/ 26 сентября 2012

Еще одна вещь, на которую следует обратить внимание: когда вы щелкаете файл xcdatamodeld для просмотра сущностей, а что нет, в разделе КОНФИГУРАЦИИ слева, Конфигурация по умолчанию, вы видите список сущностей. Если они являются классами в вашем проекте (что, я думаю, должно быть), убедитесь, что имена классов указаны в столбце Класс.

0 голосов
/ 08 июля 2015

Я столкнулся с этой проблемой, и у меня было очень странное исправление.Я скопировал / вставил некоторый код из другого проекта для фактического создания сущности (и затем изменил значения для сущности и контекста):

NSEntityDescription *e = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:testContext];

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

Все, что я сделал, это удалил строку, изменил имя переменной и вручную набрал ее:

NSEntityDescription *entity = [NSEntityDescription entityForName:@"MyEntity" inManagedObjectContext:testContext];

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

0 голосов
/ 16 апреля 2015

В моем случае:

  1. Мой Model.xcdatamodeld сначала в приложении (имя A), затем работает нормально
  2. Я добавляю модификацию приложения в статическую библиотеку
  3. добавить шаг 2 static lib в новое приложение (имя B)

У меня та же проблема, что и на Камчатке при использовании приложения B

Вы можете попробовать переместить Model.xcdatamodeld в основной проект, чтобы попробовать, это работает для меня.

0 голосов
/ 07 февраля 2013

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

Для отладки:

  • Чтобы распечатать все объекты вобъектная модель использовала это: NSDictionary * dictionary = [self.managedObjectContext.persistentStoreCoordinator.managedObjectModel entityByName];[словарь enumerateKeysAndObjectsWithOptions: NSEnumerationConcurrent usingBlock: ^ (идентификатор ключа, идентификатор объекта, BOOL * stop) {NSLog (@ "% @ =% @", ключ, объект);}];
  • Также используется для вывода количества сущностей: NSLog (@ "Количество сущностей:% d", [[self.managedObjectContext.persistentStoreCoordinator.managedObjectModel entity] count]);
0 голосов
/ 02 августа 2012

Я столкнулся с этой проблемой при одновременном открытии нескольких проектов в Xcode 4.4.

Если у вас несколько проектов, Xcode 4.4 может использовать модель данных из неверного проекта и не может найти ваши объекты. Решением было открыть одновременно только один проект.

...