CoreData - это структура управления графами объектов, а не хранилище данных SQL. Таким образом, вы должны - как можно быстрее - избавиться от мышления SQL. NSPredicate
предназначается как предикат - не удивительно - для квалифицируемых объектов в графе объектов. Таким образом, вы можете получить все объекты, которые соответствуют запросу, но это не то же самое, что группировка этих результатов. Если вы хотите выполнить агрегатные операции, используйте операторы кодирования Key-Value . Под капотом Core Data может преобразовать их в разумный SQL, но это исключительно детали реализации.
В этом случае вы можете получить набор уникальных packTitle
значений с помощью
[myCards valueForKeyPath:@"@distinctUnionOfObjects.packTitle"];
, который даст вам отличный набор packTitle
значений в коллекции myCards
. Если вы хотите это для всех карт в хранилищах базовых данных, вам нужно будет выполнить запрос для всех cards
, а затем применить эту операцию сбора.
Альтернативой является создание сущности PackInformation
или некоторой такой, которая содержит свойство title
. После этого в хранилище данных может быть только 3 таких объекта, ссылаясь на них из соответствующих объектов пакета. Тривиально получить все три (или каков бы ни был последний номер) и получить их названия.
Как уже говорили другие, если то, что вы пытаетесь сделать, - это фундаментальное представление данных из набора реляционных данных, вам лучше использовать прямой SQLite. Все зависит от того, сколько других преимуществ вы получите от Core Data.