Можно ли сортировать по подклассам в NSFetchRequest без добавления дополнительных атрибутов? - PullRequest
7 голосов
/ 14 октября 2010

Я хочу сгруппировать результаты NSFetchRequest по сущности.Все сущности имеют одного и того же абстрактного родителя.Например:

animal
|
|-cat
|
|-dog

NSFetchRequest имеет includesSubentities, установленное TRUE, и entity, установленное на animal.Можно установить sectionNameKeyPath для NSFetchedResultsController равным entity.name, но невозможно сделать то же самое с sortDescriptors для NSFetchRequest из-за того, что sortDescriptors применяется к сохраненным атрибутам (т.е.данные в базе данных, а не методы на классах).Поэтому единственный способ группировки по типу сущности - это добавить атрибут к суперклассу, который подклассы могут использовать для идентификации себя.

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

В заключение: можно ли сортировать по подклассам в NSFetchRequest без добавления дополнительных атрибутов?

1 Ответ

2 голосов
/ 19 сентября 2011

Я думаю, что ответ - нет.

Извлечение и сортировка происходят в хранилище (для хранилища SQLLite), поэтому атрибуты должны быть частью модели данных. Из руководства по программированию основных данных (Persistent Store Features):

Есть некоторые взаимодействия между извлечением и типом магазина. В хранилищах XML, двоичных данных и в памяти оценка дескрипторов предикатов и сортировки выполняется в Objective-C с доступом ко всем функциям Cocoa, включая методы сравнения на NSString. Хранилище SQL, с другой стороны, компилирует предикаты и сортирует дескрипторы в SQL и оценивает результат в самой базе данных. Это делается главным образом для повышения производительности, но это означает, что оценка происходит в среде, не относящейся к Какао, и поэтому дескрипторы сортировки (или предикаты), которые полагаются на Какао, не могут работать.

также

Кроме того, вы не можете сортировать переходные свойства, используя хранилище SQLite.

...