如何在核心数据中执行此MySQL查询?

时间:2010-08-31 01:08:14

标签: iphone mysql sqlite core-data

我如何在Core Data中执行相当于此语句的操作?基本上我想得到foo的最多10次出现的列表/它出现的次数。

基本上我将所有用户搜索记录为Core Data中的单个条目。我希望能够选择他们最常搜索的10个项目,然后按照最受欢迎的顺序显示它们。所以我基本上想要这样的东西:


  • Baa | 10
  • 海| 8
  • Box | 6

等.....


感谢您提供的任何帮助。我还是Core Data的新手。

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

2 个答案:

答案 0 :(得分: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:arguments:列表所在的位置。

答案 1 :(得分:0)

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

<强>更新 根据您需要提供今天/月/年的热门搜索而不是问题中给出的“所有时间”,根据documentation,您必须分两步执行此操作。假设您的实体SearchEvent具有searchTerm和searchDate属性:

  1. 使用NSPredicate在给定日期之后返回所有SearchEvent
  2. 迭代结果以聚合searchTerm的出现次数。使用NSMutableDictionary进行分组
  3. 这可能是一项昂贵的操作,因此您可以将结果保存在后台更新的缓存中