如何为 child 实体创建 FetchRequest 谓词,其中 parent 实体满足 NSPredicate

How do I create a FetchRequest predicate for a child entity where the parent entity satisfies a NSPredicate

我有两个核心数据实体:ParentChildParent对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 的错误。

希望这是有道理的?有什么想法或建议吗?

谢谢

如果ChildParent的关系是to-one,那么就不需要SUBQUERY。在父谓词的格式字符串中(您可以使用 predicateFormat 获得),您可以将字符串中的每个父属性名称替换为子属性的关键路径,即

attribute becomes parent.attribute

然后可以使用 NSCompoundPredicateandPredicateWithSubpredicates.

将生成的谓词与子谓词组合

如果解析 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