2010-08-31 99 views
4

我如何在Core Data中做这个声明的等价物?基本上我想要得到foo发生次数最多的10次。如何在核心数据中执行此MySQL查询?

基本上,我将所有用户搜索记录为核心数据中的单个条目。我希望能够选择他们最常搜索的10个项目,并按照最受欢迎的顺序显示它们。所以基本上我想是这样的:


  • 巴阿| 10
  • 海| 8
  • Box | 6个

等.....


感谢您的帮助,您可以提供。我对Core Data仍然很陌生。

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

回答

1

首先更新的结果,建立一个核心数据实体有: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]在像过滤器指定它是不区分大小写。您可能还需要改变这种过滤器根据日期和格式化您要使用

然后,设置fetchResultType为NSDictionaryResultType

[fetchRequest setResultType:NSDictionaryResultType]; 

这将返回一个字典,您可以使用。

要使用聚合函数,你需要使用NSExpressionDescription

这是一个广泛的代码,我不能够正确地测试它的你,但你可以在这里阅读。在部分抓取特定值,它描述了如何做聚合函数: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html

NSExpression的所有可用集合函数的引用到功能expressionForFunction:参数:在列表所在。

+0

感谢您的回复。我试过使用:NSExpression * countNameExpression = expressionForFunction:arguments:w/count:然后执行获取请求,但这只是给我总数。关于我在做什么的任何想法都是错误的? – 2010-09-01 21:29:48

+0

您是否曾使用NSPredicate过滤特定日期和搜索项的内容? 我在编辑答案,在谓词中包含“AND”语句 – elcool 2010-09-02 01:34:58

+0

这就是问题所在。我没有搜索字词。我只希望所有搜索条件都按照它们发生的时间顺序排列。 – 2010-09-02 17:54:49

0

核心数据不支持聚合表达式。我建议你改变你的模型。你的实体说“搜索”将有两个属性,searchTerm和occurrences。在执行新的搜索时,检查给定的searchTerm是否已经存在,如果是,则增加事件,如果不插入新的实体。当您想要显示前十名时,可以按事件对对象进行排序并显示前10项。

UPDATE: 根据你的需要来呈现顶部搜索今天/月/年,而不是在问题给出“所有时间”,按该documentation你将不得不为此在两个步骤。假设你的实体,SearchEvent,有属性SEARCHTERM和searchDate:

  1. 使用NSPredicate返回所有SearchEvents给定日期
  2. 遍历结果后聚集SEARCHTERM的出现的次数。使用NSMutableDictionary为分组

这是潜在的昂贵的操作,所以它可能会让你感觉保持高速缓存,你在后台

+0

我想到了这一点,但问题是我想能够显示上周,月和年最受欢迎。任何想法如何实现? – 2010-08-31 17:10:46

+0

根据新的要求给出了更新的答案 – falconcreek 2010-08-31 19:27:28

+0

我还在开发人员文档中阅读了Core Data不支持聚合表达式......但在此页面上的文档中:Core Data的Xcode工具http://developer.apple.com/ library/mac /#documentation/DeveloperTools/Conceptual/XcodeCoreDataTools/Articles/xcdPredicateBuilder.html它在表达式编辑器中清楚地显示了带有@avg的图像。奇怪。 – 2011-01-28 06:44:18