Сортировка NSFetchRequest по предикату

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

[NSPredicate predicateWithFormat:@"uid = %@", currentUID]

К сожалению, кажется, что невозможно сформулировать подобное условие с помощью NSSortDescriptor. Как мне лучше поступить в этом случае? Я получаю два списка, один с

[NSPredicate predicateWithFormat:@"uid = %@", currentUID]

и один с

[NSPredicate predicateWithFormat:@"uid != %@", currentUID]

и объединить их позже? Могу ли я тогда по-прежнему элегантно использовать NSFetchedResultsController?
Или я должен получить все элементы и отсортировать их позже в коде? Или я что-то пропустил.


person Raphael Schweikert    schedule 17.02.2011    source источник


Ответы (2)


Просто создайте массив (даже если он содержит только один элемент) NSSortDescriptors, чтобы отсортировать результат по желанию.

Вы используете setSortDescriptors: для их установки.

Выборка может обрабатывать как предикаты, так и сортировку одновременно.

person Monolo    schedule 09.03.2013
comment
Дело не в том, что я не знаю, как установить несколько NSSortDescriptor. Скорее, мой вопрос был в двух словах: как мне настроить мой NSSortDescriptor для сортировки по выражению вместо имени статического поля? - person Raphael Schweikert; 09.03.2013
comment
@RaphaelSchweikert А, извините. Вы не можете, правда. См. этот вопрос: stackoverflow.com/questions/11927762/ И, как следует из цитаты из документации, вы, вероятно, тоже не должны. - person Monolo; 09.03.2013

То, о чем вы просите, не имеет смысла.

Предикат используется для выбора объектов, которые должны быть возвращены в наборе результатов. Это определяется путем оценки предиката для каждого объекта, чтобы увидеть, оценивается ли предикат как YES или NO (двоичное значение или одно из 2 возможных значений). Если он оценивается как YES, объект включается. Если он оценивается как NO, объект исключается. Там нет никакого среднего.

Напротив, дескриптор сортировки оценивается как less than, equal или greater than. Другими словами, это троичное значение (это может быть одна из 3 вещей). Невозможно выразить троичное значение с помощью предиката (поскольку предикат является бинарным), поэтому использование предиката в качестве дескриптора сортировки абсолютно бессмысленно. API этого не позволяет, потому что этого не позволяет логика.

Итак, реальный вопрос: что вы пытаетесь сделать? Как вы думаете, зачем вам нужен предикат в ваших дескрипторах сортировки?

person Dave DeLong    schedule 17.02.2011
comment
Хорошо, я понимаю, откуда вы пришли, и вижу, что мое описание было немного запутанным. Я не пытаюсь ИСПОЛЬЗОВАТЬ предикаты для сортировки результатов, я просто упомянул их, потому что они предоставляют функциональные возможности для вычисления значения, по которому я хочу отсортировать результаты. Другими словами, все результаты, в которых совпадает мой предикат, должны предшествовать результатам, в которых предикат не совпадает; логическое значение, возвращаемое предикатом для одного объекта, должно использоваться дескриптором сортировки для сравнения его с другим объектом (что дает ваш троичный результат). Надеюсь, это прояснит ситуацию. - person Raphael Schweikert; 18.02.2011