Я пытаюсь получить количество записей из связанного объекта, которые соответствуют критериям

У меня есть совпадения сущностей, которые связаны со многими наборами сущностей. Я хочу подсчитать, сколько наборов имеет атрибут set_finished, для которого установлено значение YES для конкретного совпадения. Я пытаюсь сделать это с помощью:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ЛЮБОЙ set_finished == YES"]; NSUInteger numberOfFinishedSets = [[[match valueForKeyPath:@"sets"] filteredArrayUsingPredicate:predicate ] count];

Вторая строка вылетает с этой ошибкой, которую я не понимаю. Может ли кто-нибудь пролить свет на это для меня? Спасибо.

2010-12-20 13:17:13.814 DartScorer[2154:207] * Завершение приложения из-за необработанного исключения «NSInvalidArgumentException», причина: «-[_NSFaultingMutableSet filteredArrayUsingPredicate:]: нераспознанный селектор отправлен экземпляру 0x617fb20 '


person lps    schedule 20.12.2010    source источник


Ответы (4)


Вы должны использовать filteredSetUsingPredicate: вместо filteredArrayUsingPredicate, поскольку объект представляет собой набор, а не массив.

person Mike Weller    schedule 20.12.2010
comment
Спасибо. Конечно! Я не уверен, как я пропустил это! Удивительно, сколько раз я могу что-то прочитать и не увидеть очевидной ошибки. - person lps; 20.12.2010

_NSFaultingMutableSet — это своего рода пустой набор (если вы напечатаете набор, вы увидите, что xcode печатает имя объекта, но не его содержимое. Он делает это, потому что:

Ошибка уменьшает объем памяти, потребляемой вашим приложением. Сбой — это объект-заполнитель, представляющий управляемый объект, который еще не полностью реализован, или объект-коллекция, представляющий отношение:

Сбой управляемого объекта является экземпляром соответствующего класса, но его постоянные переменные еще не инициализированы. Ошибка отношения — это подкласс класса коллекции, который представляет отношение. Ошибка позволяет Core Data устанавливать границы графа объектов. Поскольку ошибка не реализуется, ошибка управляемого объекта потребляет меньше памяти, а управляемые объекты, связанные с ошибкой, вообще не должны быть представлены в памяти.

я думаю, вам следует создать набор для хранения объектов, которые вы хотите отфильтровать, а затем отфильтровать массив, который вы создали.

надеюсь, это поможет Шани

person shannoga    schedule 20.12.2010

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(ANY set_finished == YES).@count"];  
NSUInteger numberOfFinishedSets = [[match valueForKeyPath:@"sets"] filteredSetUsingPredicate:predicate];

Это просто вернет количество объектов вместо фактического извлечения объектов с диска и их подсчета.

person Mark Adams    schedule 20.12.2010
comment
Вы пробовали это? filteredSetUsingPredicate возвращает набор, а не количество - person Z S; 01.07.2014

Попробуйте заключить строку YES в одинарные кавычки "... 'YES'"

(при условии, что поле содержит строки «ДА» и «НЕТ», а не 1 | 0)

person Tim    schedule 20.12.2010