swift Core Data谓词过滤给定父级的所有子数据

Posted

技术标签:

【中文标题】swift Core Data谓词过滤给定父级的所有子数据【英文标题】:swift CoreData predicates to filter all the child data of a given parent 【发布时间】:2020-05-31 05:34:45 【问题描述】:

有两个实体ChildParentParentChild 是一对多关系,Parent 与多个 Child 是一对。

我参考的代码如下,它可以过滤Child级别属性text包含yes的所有数据:

@State private var predicate: NSPredicate? = NSPredicate(format: "text contains[c] %@", "yes")
@ObservedObject private var db = CoreDataDB<Child>()

for child in self.db.loadDB(predicate: self.predicate):
    ....

我要做的是让所有Child级别的数据属于当前Child数据的Parent

var child: Child

// How to write this line???
@State private var predicate: NSPredicate? = NSPredicate(format: "parent = %@", "self.child.parent")

@ObservedObject private var db = CoreDataDB<Child>()

for child in self.db.loadDB(predicate: self.predicate):
    ....

我不知道如何编写上面的predicate 来过滤当前child 的视图中与当前child 属于同一Parent 的数据。

NSPredicate(format: "parent = %@", "self.child.parent")for child in self.db.loadDB(predicate: self.predicate): 时将一无所获。

NSPredicate(format: "child.parent = %@", "self.child.parent") 会报错keypath child.parent not found in entity &lt;NSSQLEntity Child id=1&gt; with userInfo of (null)

我需要说的是,代码中Child Entitytext 是我创建的一个属性,但是Child Entityparent 是由one to manyParent Entity 的关系自动创建的。我在xcdataModelId 文件中看不到parent 属性,但我可以在代码中使用它。

感谢您的帮助。

【问题讨论】:

【参考方案1】:

这里

NSPredicate(format: "parent = %@", "self.child.parent")

您用 字符串 代替 %@ 占位符。你想要的是

NSPredicate(format: "parent = %@", self.child.parent)

搜索parent 等于self.childparent 的所有实体。

【讨论】:

以上是关于swift Core Data谓词过滤给定父级的所有子数据的主要内容,如果未能解决你的问题,请参考以下文章

我需要帮助将 Core Data 的结果放入 Swift 3 中的数组中

Java 8 数据过滤,removeIf 和 filter 别用错了!!

iOS Core Data Predicate 用于根据相关数据进行过滤

在 UUID 类型属性上使用 @FetchRequest 谓词过滤进行不可靠更新?

使用谓词的字典过滤器数组 - swift3

如何在 Oracle 11g 中查找给定父级的所有子 ID