Вопрос

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

- (NSUInteger)countEntity:(NSString *)entityName 
                inContext:(NSManagedObjectContext *)context{

    NSFetchRequest *request = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription entityForName:entityName                     
                                                  inManagedObjectContext:context];
    [request setEntity:entity];
    [request setIncludesSubentities:NO];
    NSError *error = nil;
    NSUInteger count = [context countForFetchRequest:request error:&error];
    [request release];
    return count;
}

Линия:

NSUInteger count = [context countForFetchRequest:request error:&error];

бросает NSInternalInconsistencyException reason: 'entity not found'

Изменение на:

NSUInteger count = [[context executeFetchRequest:request error:&error] count];

работает без проблем.

Я здесь в растерянности.Есть идеи?

Спасибо!

/Оскар

Это было полезно?

Решение

Сегодня столкнулся с этим.Это началось, когда я представил второе постоянное хранилище.У вас есть более одного магазина в МЦ?-Кен

Другие советы

Чего бы это ни стоило, я только что столкнулся с похожей ошибкой, когда executeFetchRequest:error и countForFetchRequest:error: не согласны с количеством объектов в запросе на выборку.

Сценарий: я вложен NSManagedObjectContexts с корневым контекстом типа NSPrivateQueueConcurrencyType (для сохранения на диск), поддерживаемый постоянным хранилищем и дочерним элементом этого типа NSMainQueueConcurrencyType (для использования графическим интерфейсом).(Да, я использую MagicalRecord)

у меня есть ViewController слушать NSManagedObjectContextDidSaveNotification из «основного» контекста.Когда это уведомление срабатывает countForFetchRequest:error: Метод не включает изменения, сделанные в контексте, которые не были сохранены в родительском корневом контексте. executeFetchRequest:error однако возвращает ожидаемый набор объектов.

Немного странно.

Проверьте несколько вещей:

  1. Какова ценность error после первого звонка?Причина, по которой вы передаете этот объект, состоит в том, чтобы получить из него информацию, когда что-то пойдет не так.
  2. Какова ценность [request entity] после первого звонка?Возможно, я совершенно не в курсе, но я очень смутно помню кое-что о том, что запрос был разовой сделкой:как только вы его выполните, вам придется сбросить все поля, прежде чем вы сможете выполнить его снова.Убедитесь, что все свойства вашего запроса остаются действительными после первого вызова, или, что еще лучше, создайте второй экземпляр NSFetchRequest для выполнения второго вызова.
  3. Аналогичным образом, что произойдет, если вы прокомментируете первый вызов?Если переключить порядок звонков?Результат одного может повлиять на другой.

Я подозреваю, что entity является nil (т.е. context равно нулю или не имеет правильно настроенного координатора постоянного хранилища с моделью управляемых объектов, содержащей вашу сущность, или вы допустили ошибку в написании имени сущности где-то в объектной модели или в вызывающем коде).Подтвердите это entity не является nil после звонка в +[NSEntityDescription entityForName:inManagedObjectContext:].

Я запустил ваш метод countEntity:в одном из моих собственных проектов, и он работал нормально.Единственный способ заставить его выдать исключение («_countWithNoChangesForRequest: error:Запрос на выборку должен иметь сущность.»), когда я неправильно написал имя сущности (виджеты вместо «Виджеты»).Итак, вы можете исследовать в этом направлении.

Проблема, с которой вы столкнулись, связана с неправильным использованием countForFetchRequest:error:.Действительно, в вашем фрагменте кода вы сначала выполняете запрос на выборку, используя ExecuteFetchRequest:error, а затем переходите к использованию countForFetchRequest:error:.

Из документации метода:

Возвращает количество объектов, которые вернул бы данный запрос на выборку, если бы он был передан в метод выполненияFetchRequest:error:.

Поэтому вы НЕ должны выполнять запрос на выборку перед вызовом countForFetchRequest:error:.

Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top