如何为 child 实体创建 FetchRequest 谓词,其中 parent 实体满足 NSPredicate
How do I create a FetchRequest predicate for a child entity where the parent entity satisfies a NSPredicate
我有两个核心数据实体:Parent
和 Child
。
Parent
对children
的集合有属性children
每个 Child
都有一个 parent
属性 链接到它的 parent,还有一个 age
属性。
(我的数据比这个更复杂,但与问题无关)
我有一个 NSPredicate
用于选择一组 parent 实体的 NSPredicate
和一个用于选择实体的 Child
实体的 NSPredicate
基于年龄
我想做的是为 FetchRequest<Child>
构造一个 NSPredicate
,returns 满足两个单独谓词的 Child
实体集
我知道我可以检索满足其谓词 ('parents
') 的 Parent
实体数组,然后有一个 child 谓词,例如 NSPredicate(format: "parent IN %@", parents)
并包括在复合 AND 和 child 谓词中,但可能有数百个 parent 满足他们的谓词,在我看来,有两个单独的查询有点麻烦。
FetchRequest
需要是 FetchRequest<Child>
,因为它在 SwiftUI 视图中使用,所以我不能只构建结果数组。
我怀疑我可以使用 SUBQUERY 谓词来做到这一点,但我不知道如何将 parent 谓词嵌入到 SUBQUERY 中。我在 Parent
实体的谓词字符串中收到类似 Problem with subpredicate TRUEPREDICATE
的错误。
希望这是有道理的?有什么想法或建议吗?
谢谢
如果Child
到Parent
的关系是to-one,那么就不需要SUBQUERY。在父谓词的格式字符串中(您可以使用 predicateFormat
获得),您可以将字符串中的每个父属性名称替换为子属性的关键路径,即
attribute
becomes parent.attribute
然后可以使用 NSCompoundPredicate
的 andPredicateWithSubpredicates
.
将生成的谓词与子谓词组合
如果解析 predicateFormat 不切实际,另一种选择是使用 NSFetchRequestExpression
将一个提取的结果作为参数传递给另一个(它被转换为 SQL 子选择)。像这样:
let parentFetch = Parent.fetchRequest()
parentFetch.predicate = parentPredicate // your existing predicate to fetch the parent objects
parentFetch.resultType = .managedObjectIDResultType
let ctxtExp = NSExpression(forConstantValue: managedObjectContext)
let fetchExp = NSExpression(forConstantValue: parentFetch)
let fre = NSFetchRequestExpression.expression(forFetch: fetchExp, context: ctxtExp, countOnly: false)
let childFetch = Child.fetchRequest()
let subPredicate = NSPredicate(format:"parent IN %@",fre)
let combinedPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [subPredicate, childPredicate]) // childPredicate is you existing predicate to fetch the correct Child objects
childFetch.predicate = combinedPredicate
... proceed to execute the fetch against the relevant context
我有两个核心数据实体:Parent
和 Child
。
Parent
对children
children
每个 Child
都有一个 parent
属性 链接到它的 parent,还有一个 age
属性。
(我的数据比这个更复杂,但与问题无关)
我有一个 NSPredicate
用于选择一组 parent 实体的 NSPredicate
和一个用于选择实体的 Child
实体的 NSPredicate
基于年龄
我想做的是为 FetchRequest<Child>
构造一个 NSPredicate
,returns 满足两个单独谓词的 Child
实体集
我知道我可以检索满足其谓词 ('parents
') 的 Parent
实体数组,然后有一个 child 谓词,例如 NSPredicate(format: "parent IN %@", parents)
并包括在复合 AND 和 child 谓词中,但可能有数百个 parent 满足他们的谓词,在我看来,有两个单独的查询有点麻烦。
FetchRequest
需要是 FetchRequest<Child>
,因为它在 SwiftUI 视图中使用,所以我不能只构建结果数组。
我怀疑我可以使用 SUBQUERY 谓词来做到这一点,但我不知道如何将 parent 谓词嵌入到 SUBQUERY 中。我在 Parent
实体的谓词字符串中收到类似 Problem with subpredicate TRUEPREDICATE
的错误。
希望这是有道理的?有什么想法或建议吗?
谢谢
如果Child
到Parent
的关系是to-one,那么就不需要SUBQUERY。在父谓词的格式字符串中(您可以使用 predicateFormat
获得),您可以将字符串中的每个父属性名称替换为子属性的关键路径,即
attribute
becomesparent.attribute
然后可以使用 NSCompoundPredicate
的 andPredicateWithSubpredicates
.
如果解析 predicateFormat 不切实际,另一种选择是使用 NSFetchRequestExpression
将一个提取的结果作为参数传递给另一个(它被转换为 SQL 子选择)。像这样:
let parentFetch = Parent.fetchRequest()
parentFetch.predicate = parentPredicate // your existing predicate to fetch the parent objects
parentFetch.resultType = .managedObjectIDResultType
let ctxtExp = NSExpression(forConstantValue: managedObjectContext)
let fetchExp = NSExpression(forConstantValue: parentFetch)
let fre = NSFetchRequestExpression.expression(forFetch: fetchExp, context: ctxtExp, countOnly: false)
let childFetch = Child.fetchRequest()
let subPredicate = NSPredicate(format:"parent IN %@",fre)
let combinedPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [subPredicate, childPredicate]) // childPredicate is you existing predicate to fetch the correct Child objects
childFetch.predicate = combinedPredicate
... proceed to execute the fetch against the relevant context