Сортировка NSFetchRequest на основе класса сущности

Я использую CoreData и имею две части с общей абстрактной супер-сущностью, назовем их

SuperEntity,
FirstSubEntity and
SecondSubEntity

Все три объекта имеют собственный подкласс NSManagedObject или SuperEntity.

Я использую NSFetchRequest для получения всех объектов типа SuperEntity, то есть я получу набор всех FirstSubEntities и SecondSubEntities, перемешанных вместе. Я хочу отсортировать этот набор на основе класса сущности, например.

  • <FirstSubEntity id=X>
  • <FirstSubEntity id=X>
  • <FirstSubEntity id=X>
  • ...
  • <SecondSubEntity id=X>
  • <SecondSubEntity id=X>
  • ...

Я пытаюсь установить NSSortDescriptor с помощью ключа class:

[NSSortDescriptor sortDescriptorWithKey:@"class" ascending:YES]

К сожалению, это вызывает исключение

'NSInvalidArgumentException', reason: 'keypath class not found in entity <NSSQLEntity SuperEntity id=X>'

Любопытно, что если я вместо этого использую NSFetchedResultsController, я могу установить для sectionName значение class следующим образом

[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                    managedObjectContext:[RKManagedObjectStore defaultStore].mainQueueManagedObjectContext
                                      sectionNameKeyPath:@"class"
                                                acheName:nil];

Что отлично работает. Есть идеи, как с этим справиться с NSSortDescriptors?


person akelagercrantz    schedule 08.01.2014    source источник


Ответы (1)


Это работает в sectionNameKeyPath, потому что sectionNameKeyPath разрешается после загрузки объектов в память. NSFetchRequest и его дескрипторы сортировки выполняются на уровне SQLite, ключ class не имеет смысла.

Кроме того, на уровне SQL ваши две сущности действительно находятся в одной таблице, поэтому на этом этапе их невозможно различить и, следовательно, отсортировать.

Единственное решение - отсортировать их в памяти, а не в выборке напрямую. Вы можете использовать NSSortDescriptor против возвращаемого массива из обычного запроса выборки, и в этом случае я бы использовал entity.name вместо class.

person Marcus S. Zarra    schedule 09.01.2014
comment
«Это больше не работает для iOS 10: 'NSInvalidArgumentException', причина: 'keypath entity.name не найдено в объекте‹ NSSQLEntity [EntityName] id = 1 ›’ »Маркус, можно ли сортировать результаты по имени объекта? У тебя есть решение? - person Yarlik; 15.08.2016