NSPredicate что-то эквивалентное SQL GROUP GROUP - PullRequest
10 голосов
/ 27 июля 2011

Для упрощения: В таблице 3 столбца с именем «Карты».

id packTitle term

id - это столбец - целые числа от 0 ..... 100

packTitle - строка, описывающая пакеты, скажем, есть 3 вида пакетов PACK1, PACK2, PACK3

термин - разные несортированные имена из 101 наименования.

с помощью оператора SQL

select packTitle from cards group by packTitle;

Я могу получить список из 3 предметов.

Не могли бы вы предложить NSP предикатный эквивалент оператора SQL GROUP BY. Мне нужно получить массив для заполнения в UITableView.

Ответы [ 2 ]

15 голосов
/ 27 июля 2011

CoreData - это структура управления графами объектов, а не хранилище данных SQL. Таким образом, вы должны - как можно быстрее - избавиться от мышления SQL. NSPredicate предназначается как предикат - не удивительно - для квалифицируемых объектов в графе объектов. Таким образом, вы можете получить все объекты, которые соответствуют запросу, но это не то же самое, что группировка этих результатов. Если вы хотите выполнить агрегатные операции, используйте операторы кодирования Key-Value . Под капотом Core Data может преобразовать их в разумный SQL, но это исключительно детали реализации.

В этом случае вы можете получить набор уникальных packTitle значений с помощью

[myCards valueForKeyPath:@"@distinctUnionOfObjects.packTitle"];

, который даст вам отличный набор packTitle значений в коллекции myCards. Если вы хотите это для всех карт в хранилищах базовых данных, вам нужно будет выполнить запрос для всех cards, а затем применить эту операцию сбора.

Альтернативой является создание сущности PackInformation или некоторой такой, которая содержит свойство title. После этого в хранилище данных может быть только 3 таких объекта, ссылаясь на них из соответствующих объектов пакета. Тривиально получить все три (или каков бы ни был последний номер) и получить их названия.

Как уже говорили другие, если то, что вы пытаетесь сделать, - это фундаментальное представление данных из набора реляционных данных, вам лучше использовать прямой SQLite. Все зависит от того, сколько других преимуществ вы получите от Core Data.

2 голосов
/ 27 июля 2011

Предполагается, что вы используете CoreData ... в соответствии с Документацией Apple

Нельзя обязательно переводить «произвольные» запросы SQL в предикаты или извлекать запросы.Например, невозможно преобразовать оператор SQL, такой как

SELECT t1.name, V1, V2
    FROM table1 t1 JOIN (SELECT t2.name AS V1, count(*) AS V2
        FROM table2 t2 GROUP BY t2.name as V) on t1.name = V.V1

, в запрос выборки.Вы должны выбрать интересующие объекты, а затем либо выполнить вычисление напрямую, используя результаты, либо использовать оператор массива.

Если вам нужно выполнять сложные запросы, подобные этому, вам может быть лучше использовать SQLite.

...