核心数据在过滤器中使用聚合函数

Posted

技术标签:

【中文标题】核心数据在过滤器中使用聚合函数【英文标题】:Core data use aggregate function in filter 【发布时间】:2016-02-28 09:40:56 【问题描述】:

这是否可以在过滤器中使用聚合函数:

var expressionDescriptions = [AnyObject]()
let request = NSFetchRequest(entityName: "Item")
let expressionDescription = NSExpressionDescription()
expressionDescription.name = "requestsCount"
expressionDescription.expression = NSExpression(format: "@sum.requests.id")
expressionDescription.expressionResultType = .Integer32AttributeType
expressionDescriptions.append(expressionDescription)

request.predicate = NSPredicate(format: "requestsCount != sitesCount")
request.propertiesToFetch = expressionDescriptions
do 
    let items = try self.managedObjectContext.executeFetchRequest(request)
 catch 

此代码返回错误:

由于未捕获的异常而终止应用程序 'NSInvalidArgumentException',原因:'keypath requestsCount not found 在实体中

【问题讨论】:

【参考方案1】:

在使用 NSExpression 和相关 API 的方式上存在一些问题。这很难,在你的情况下可能没有必要。

假设这个数据结构:

Item (requests) <--->> NSSet? (Request)
     (sitesCount) Int

您应该简单地获取所有项目并签入内存。这应该不会造成任何资源限制问题(如果有,您可以稍后进行优化):

filteredItems = allItems.filter  ($0.requests?.count ?? 0) != $0.sitesCount 

【讨论】:

以上是关于核心数据在过滤器中使用聚合函数的主要内容,如果未能解决你的问题,请参考以下文章

十MySQL 聚合函数分组查询及过滤分组

十MySQL 聚合函数分组查询及过滤分组

加入表和过滤并获取聚合函数sql访问

在常规过滤查询中使用“COUNT INTO 长度”或聚合函数

Cognos:使用聚合函数后进行过滤

HiveSQL核心技能之窗口计算