Как сделать этот MySQL Query в Core Data? - PullRequest
4 голосов
/ 31 августа 2010

Как бы я сделал эквивалент этого утверждения в Core Data?По сути, я хочу получить список из 10 наиболее часто встречающихся foo вместе с тем, сколько раз это происходит.

По сути, я записываю все запросы моих пользователей как отдельные записи в Базовых данных.Я хочу иметь возможность выбрать их 10 наиболее популярных элементов и отображать их в порядке, начиная с самых популярных.В общем, я хочу что-то вроде:


  • Baa |10
  • Море |8
  • Коробка |6

и т. Д. *


Спасибо за любую помощь, которую вы можете оказать.Я все еще новичок в Core Data.

  SELECT foo,
         COUNT(foo) AS occurances 
    FROM bar 
GROUP BY foo 
ORDER BY occurances DESC 
   LIMIT 10;

Ответы [ 2 ]

1 голос
/ 01 сентября 2010

Сначала создайте базовый объект данных, который имеет: userSearchTerm и userSearchDate. И создавайте записи каждый раз, когда выполняется поиск.

Запустите код, объявив запрос на выборку. И используйте NSPredicate для фильтрации по дате:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSEntityDescription *entity = [NSEntityDescription entityForName:@"UserSearches" inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];

NSPredicate *nameFilter = [NSPredicate predicateWithFormat:@"(userSearchDate like[cd] %@) AND (userSearchTerm like[cd] %@)",weekName,termToFind];
[fetchRequest setPredicate:nameFilter];

[cd] в фильтре like указывает, что он не чувствителен к регистру. Вам также может понадобиться изменить этот фильтр в зависимости от даты и формата, который вы хотите использовать

Затем установите fetchResultType как NSDictionaryResultType:

[fetchRequest setResultType:NSDictionaryResultType];

Это вернет словарь, который вы можете использовать.

Чтобы использовать агрегатные функции, вам нужно использовать NSExpressionDescription

Это обширный код, и я не могу его правильно протестировать, но вы можете прочитать его здесь. В разделе Выборка определенных значений описано, как выполнять агрегатные функции: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html

Для получения справки по всем доступным агрегатным функциям для NSExpression перейдите к функции expressionForFunction: arguments: , где находится список.

0 голосов
/ 31 августа 2010

Базовые данные не поддерживают выражения агрегации.Я предлагаю вам сменить модель.Ваша сущность, скажем, «Поиск» будет иметь два атрибута, searchTerm и вхождения.При выполнении нового поиска проверьте, существует ли уже заданный searchTerm, если это так, увеличивайте вхождения, если не вставляете новую сущность.Если вы хотите показать первую десятку, вы можете отсортировать объекты по вхождению и отобразить первые 10 элементов.

ОБНОВЛЕНИЕ: Основано на вашей необходимости представлять самые популярные запросы на сегодняшний день / месяц / год вместо "все время", указанного в вопросе, согласно документации , которую выпридется сделать это в два этапа.Предполагая, что ваша сущность SearchEvent имеет атрибуты searchTerm и searchDate:

  1. Используйте NSPredicate, чтобы вернуть все SearchEvents после указанной даты
  2. Выполните итерацию по результатам, чтобы агрегировать число вхожденийискать термин.Используйте NSMutableDictionary для группировки

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...