如何使用 NSPredicate 在 CoreData 中通过 NSSet 属性 的元素过滤对象?

How to use NSPredicate to filter objects by the element of their NSSet property in CoreData?

我有两个class,一个叫Folder,另一个叫Entry.

在我的数据模型中,一个文件夹会包含多个条目,一个条目可以包含在不同的文件夹中。

因此每个文件夹都有一个 folderID 来标识自己,以及一个名为 entries 的关系,用于包含 Entry 个实例。每个条目都有一个名为 superFolders 的反向关系,指向包含它的文件夹。

现在是我的问题。在这里我得到一个 folderID。我想使用它和 NSFetchRequest 来获取核心数据中这个特殊文件夹包含的所有 entries。以下是主要代码:

let fetchRequest = NSFetchRequest<Entry>(entityName: "Entry")
fetchRequest.predicate = NSPredicate(format: "(ANY folder in %K).folderID = %i", #keyPath(Entry.superFolders), folerID)

上面代码中的格式字符串不正确,但它主要解释了我的意思。由于 superFolders 属性 实际上是 Core Data 中的一个 NSSet ,所以我不能用 superFolders.folderID == %i 作为判断条件。我真正想要的是找到所有 superFolder 属性 包含 任何元素 且其 folderID 属性 匹配给定的条目folderID.

那么可以用 NSPredicate 来表达我对 Core Data 的意思吗?

你想要:

let fetchRequest = NSFetchRequest<Entry>(entityName: "Entry")
fetchRequest.predicate = NSPredicate(format: "ANY superFolders.folderID = %@", folderID)

NSPredicate reference

如果在 superFolders 关系上有更复杂的匹配,则需要使用 SUBQUERY,但在这种情况下,简单的 ANY 谓词就可以正常工作。