【发布时间】:2015-11-12 12:47:58
【问题描述】:
我需要返回一个对象列表及其相关对象的计数。似乎不可能在单个字典提取请求中执行此操作,因为我无法按 objectID 对提取结果进行分组。
let objectIDExpression = NSExpressionDescription()
objectIDExpression.name = "objectID"
objectIDExpression.expression = NSExpression.expressionForEvaluatedObject()
objectIDExpression.expressionResultType = NSAttributeType.ObjectIDAttributeType
let countExpression = NSExpressionDescription()
countExpression.name = "count"
countExpression.expression = NSExpression(forFunction: "count:", arguments: [NSExpression(forKeyPath: "entries")])
countExpression.expressionResultType = .Integer32AttributeType
let fetchRequest = NSFetchRequest(entityName: "Tag")
fetchRequest.resultType = .DictionaryResultType
fetchRequest.propertiesToFetch = [objectIDExpression, countExpression]
fetchRequest.propertiesToGroupBy = [objectIDExpression]
var error: NSError?
if let results = self.context.executeFetchRequest(fetchRequest, error: &error) {
println(results)
}
当此请求执行时,会出现以下错误:
'Invalid keypath expression ((<NSExpressionDescription: 0x7f843bf2d470>), name objectID, isOptional 1, isTransient 0, entity (null), renamingIdentifier objectID, validation predicates (
), warnings (
), versionHashModifier (null)
userInfo {
}) passed to setPropertiesToFetch:'
我还测试了只是传递 "objectID" 表达式名称,但这也失败了。
因此没有办法按对象 ID 分组吗?
【问题讨论】:
-
貌似错误在
[NSExpression(forKeyPath: "Entries")],大概是指一对多的关系,根据Core Data规则,名字不能大写。 -
抱歉,这是示例代码中的错字。我还详细说明了错误消息。需要明确的是,仅当我设置
propertiesToGroupBy属性时才会发生错误。没有它,提取工作,但每个“标签”对象没有分组。 -
关系是一对多还是多对多?即一个Entry可以有多个Tag吗?
-
@pbasdf 标签和条目之间是多对多的关系。
-
可惜...如果是一对多,您可以获取
Entries并按Tag分组。我想您可以显式地建模与中间实体的多对多关系,并在获取中使用该实体。但这是一个混乱的解决方案,需要对代码的其余部分进行大规模更改。