我如何在Core Data中执行相当于此语句的操作?基本上我想得到foo的最多10次出现的列表/它出现的次数。
基本上我将所有用户搜索记录为Core Data中的单个条目。我希望能够选择他们最常搜索的10个项目,然后按照最受欢迎的顺序显示它们。所以我基本上想要这样的东西:
等.....
感谢您提供的任何帮助。我还是Core Data的新手。
SELECT foo,
COUNT(foo) AS occurances
FROM bar
GROUP BY foo
ORDER BY occurances DESC
LIMIT 10;
答案 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属性:
NSPredicate
在给定日期之后返回所有SearchEvent NSMutableDictionary
进行分组这可能是一项昂贵的操作,因此您可以将结果保存在后台更新的缓存中