NSPredicate ALL Aggregate с хранилищем SQLite

У меня есть сущность под названием «Приложение», где она имеет отношение «ко многим» без обратной связи.

Я пытаюсь найти все объекты вложений, чей атрибут downloaded имеет значение NO, а имя отношения — attachments, и для этого я написал следующий предикат.

[NSPredicate predicateWithFormat:@"ALL attachments.downloaded == NO"]

Что приводит к *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Unsupported predicate (null)'

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

Любые идеи? В любом случае, написать предикат по-разному для достижения того же желаемого результата?


person Chris Wagner    schedule 18.05.2011    source источник


Ответы (3)


Это может быть не вовремя, НО все же кто-то может найти ответ полезным.

В настоящее время основные данные, использующие SQLite в качестве внутреннего хранилища, НЕ поддерживают модификатор ALL. Как бы просто это ни звучало, именно поэтому вы можете использовать его для фильтрации массивов в памяти для достижения желаемых результатов.

Я думаю, это связано с его «сложностью» реализации. Что касается SQLite, он реализует операцию Division над условным оператором, указанным модификатором. Однако NSPredicate не ограничивает вас в использовании его как части NSCompoundPredicate, что увеличивает сложность для генератора SQL при создании инструкции SQL.

person lblasa    schedule 28.09.2012
comment
Спасибо за этот очень полезный ответ!! Есть ли у вас какие-либо идеи о том, как построить ALL с помощью подзапроса или другого метода? - person AlexR; 20.10.2012

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

[NSPredicate predicateWithFormat:@"downloaded == NO"]

Вы пробовали это?

Тут я могу ошибаться ^_^

person dontGoPlastic    schedule 19.05.2011
comment
Да, это сработает, но я искал способ получить список вложений, которые необходимо загрузить для каждого объекта. Итак, если у меня есть объект с именем Document, который имеет вложения, мне нужен метод, которому я могу передать имя объекта Document и получить список вложений, которые необходимо загрузить для этого объекта. Я не совсем понял это в своем вопросе, извините. - person Chris Wagner; 20.06.2011

Я, кажется, нашел работу вокруг сейчас ...

attachmentRequestResults = [self.managedObjectContext executeFetchRequest:attachmentIdRequest error:&error];
attachmentPredicate = [NSPredicate predicateWithFormat:@"ALL attachments.downloaded == NO"];
attachmentRequestResults = [attachmentRequestResults filteredArrayUsingPredicate:attachmentPredicate];

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

Все еще ищу решение, где я могу выполнить предикат против Core Data, хотя

person Chris Wagner    schedule 18.05.2011