2013-06-04 2 views
0

Я новичок в Core Data, поэтому хочу написать простой запрос на выборку, чтобы сгруппировать результат по некоторому полю, а также счетчик другого поля в этой группе. так, например, у меня есть таблица продуктов я хочу, чтобы извлечь все сгруппированных продукты по дате и количество продукта, простой запрос в SQL, какNSFetchRequest для групповой и подсчетной комбинации

SELECT DateRegistered,Count(*) FROM Products Group By DateRegistered 

ответ

1

Лучше всего это очень гибкая NSFetchedResultsController. У вас будет запрос на выборку, который просто извлекает объект Product, отсортированный по атрибуту date. Обратите внимание: основные атрибуты данных должны начинаться с небольшой буквы.

Вы должны создать выбранный контроллер результатов с чем-то вроде следующего. Проверьте коды образца Apple (включая шаблоны Xcode), где это, как правило, созданные лениво контроллере представления:

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"Product"]; 
request.sortDescriptors = @[ [NSSortDescriptor 
      sortDescriptorWithKey:@"dateRegistered" 
      ascending:YES] ]; 


_fetchedResultsController = [NSFetchedResultsController 
    initWithFetchRequest:request 
    managedObjectContext:self.managedObjectContext 
    sectionNameKeyPath:@"dateRegistered" 
    cacheName:"Root"]; 

Это будет работать только в том случае, если сроки действительно одинаковы для каждого дня. Вероятно, вы захотите использовать строку, для которой для типа NSDate будет точная разбивка секунд, и вы будете считать один в каждой «группе».

С помощью получателя результатов вы можете легко получить доступ ко всем нужным вам номерам. Например. подсчет «группа» номер i (правильная терминология «раздел»):

id <NSFetchedResultsSectionInfo> sectionInfo = 
     [[_fetchedResultsController sections] objectAtIndex:i]; 
int count = [sectionInfo numberOfObjects]; 

Вы можете сделать гораздо больше с извлеченным контроллером результатов! Он будет управлять памятью для вас, облегчать отображение в вашем пользовательском интерфейсе (например, представления таблиц или виды коллекций) и минимизировать нагрузку на постоянное хранилище.

+0

поэтому, если у меня есть два продукта, первый зарегистрирован с начала дня, а второй зарегистрирован в конце дня, у меня будет два раздела справа? есть ли предикат сравнения для переопределения сравнения дат? – taffarel

+0

также есть какая-либо техника для ленивой загрузки по каждому разделу? – taffarel

+0

1) Вы должны создать отдельный атрибут только для даты. Вы можете использовать выбранное свойство (которое вычисляется «на лету»). См. Образец кода Apple «DateSectionTitles» [здесь] (http://developer.apple.com/library/ios/#samplecode/DateSectionTitles/Introduction/Intro.html). 2) ленивая загрузка включалась автоматически в выбранный контролер результатов ;-))! – Mundi