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

时间:2016-02-28 09:40:57

标签: ios swift core-data

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

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   在实体

1 个答案:

答案 0 :(得分:1)

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

假设这个数据结构:

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

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

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