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

时间:2017-02-05 16:22:29

标签: ios swift core-data nspredicate

我有两个类,一个名为Folder,另一个名为Entry

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

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

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

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

上面代码中的格式字符串不正确,但它主要解释了我的意思。由于superFolders属性实际上是核心数据中的NSSet,因此我无法使用superFolders.folderID == %i作为判断条件。我想要的是找到superFolder属性包含任何元素的所有条目,其folderID属性与给定的folderID匹配。

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

1 个答案:

答案 0 :(得分:0)

你想:

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

请参阅NSPredicate reference

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