【问题标题】:How to do this MySQL Query in Core Data?如何在 Core Data 中执行这个 MySQL 查询?
【发布时间】:2011-04-06 01:03:45
【问题描述】:

我将如何在 Core Data 中执行与此语句等效的操作?基本上我想得到 foo 出现次数最多的 10 个列表以及它出现的次数。

基本上,我将所有用户搜索记录为 Core Data 中的单个条目。我希望能够选择他们搜索次数最多的 10 个项目,并按最流行的顺序显示它们。所以基本上我想要这样的东西:


  • 咩| 10
  • 海 | 8
  • 盒子 | 6

等等……


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

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

【问题讨论】:

    标签: iphone mysql sqlite core-data


    【解决方案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];
    

    like 过滤器中的 [cd] 指定它不区分大小写。您可能还需要根据要使用的日期和格式更改此过滤器

    然后,将 fetchResultType 设置为NSDictionaryResultType:

    [fetchRequest setResultType:NSDictionaryResultType];
    

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

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

    这是一个广泛的代码,我无法为您正确测试它,但您可以在此处阅读。在获取特定值部分,它描述了如何执行聚合函数: http://developer.apple.com/mac/library/documentation/Cocoa/Conceptual/CoreData/Articles/cdFetching.html

    有关 NSExpression 的所有可用聚合函数的参考,请转到列表所在的函数 expressionForFunction:arguments:

    【讨论】:

    • 感谢您的回复。我尝试使用: NSExpression *countNameExpression = expressionForFunction:arguments: w/ count: 然后执行获取请求,但这只是给了我总数。关于我做错了什么有什么想法吗?
    • 您之前是否使用 NSPredicate 来过滤特定日期和搜索词的那些?我正在编辑答案以在谓词中包含“AND”语句
    • 这就是问题所在。我没有搜索词。我只想按出现次数的顺序列出该时间段内的所有搜索词。
    【解决方案2】:

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

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

    1. 使用 NSPredicate 返回给定日期之后的所有 SearchEvents
    2. 遍历结果以汇总 searchTerm 的出现次数。使用NSMutableDictionary 进行分组

    这可能是一项昂贵的操作,因此将结果保存在您在后台更新的缓存中可能是有意义的

    【讨论】:

    • 我想过,但问题是我希望能够显示最近一周、一个月和一年内最受欢迎的。关于如何实现这一点的任何想法?
    • 根据新要求更新答案
    • 我还在开发者文档中读到 Core Data 不支持聚合表达式...但是在文档的这个页面上:Xcode tools for Core Data developer.apple.com/library/mac/#documentation/DeveloperTools/… 它清楚地显示在底部表达式编辑器中带有@avg 的图像。奇怪。
    猜你喜欢
    • 1970-01-01
    • 2023-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2020-10-11
    • 2023-03-19
    相关资源
    最近更新 更多