如何使用 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)
如果在 superFolders
关系上有更复杂的匹配,则需要使用 SUBQUERY
,但在这种情况下,简单的 ANY
谓词就可以正常工作。
我有两个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)
如果在 superFolders
关系上有更复杂的匹配,则需要使用 SUBQUERY
,但在这种情况下,简单的 ANY
谓词就可以正常工作。