【问题标题】:CoreData fetch predicate using a set intersectionCoreData 使用集合交集获取谓词
【发布时间】:2026-01-28 22:25:02
【问题描述】:

我的核心数据模型有一个实体,其属性为 setOfStrings,类型为 Transformable
对应的类有一个属性@NSManaged var setOfStrings: Set<String>?
我想使用一个谓词来获取对象,该谓词过滤掉其属性setOfStrings 与给定集合具有集合交集的对象,例如givenSet
我尝试使用以下谓词:

NSPredicate(format: "ANY setOfStrings IN %@", givenSet)

但它总是计算为false
如果我注释掉这个谓词,则未过滤的对象将被正确提取。
我阅读了许多与该主题相关的 SO Q/A,例如this one。但是它不起作用。
我知道,如果我的属性setOfStrings 是一个关系,我可以使用子查询来获取正确的对象,如here 所示。但我没有关系,只有一组字符串。
我也读过this post,上面写着

我假设集合被定义为一个可转换的属性,它 表示它以二进制存档的形式存储在 SQLite 文件中。然后 上述查询最多适用于已加载到的对象 托管对象上下文,但不针对存储文件。

这显然与我的问题有关。但在我看来,用一对多关系替换一组简单字符串的建议解决方案似乎太复杂了。
我应该使用哪个谓词?

【问题讨论】:

  • 恐怕基于可转换属性的谓词无法作为提取的一部分。您要么必须获取所有内容,然后在内存中过滤结果,要么使用不同类型的属性:一对多关系是最好的,但您可以将字符串连接成单个字符串并将其存储.那么你的谓词可能会与之相反。但这取决于字符串的细节。
  • @pbasdf 应该是一个答案

标签: ios core-data nspredicate nsfetchrequest set-intersection


【解决方案1】:

恐怕基于可转换属性的谓词无法作为提取的一部分。您要么必须获取所有内容,然后在内存中过滤结果,要么使用不同类型的属性:一对多关系是最好的,但您可以将字符串连接成单个字符串并将其存储.那么你的谓词可能会与之相反。

但这取决于字符串的细节。例如,如果它们是单个单词,例如颜色:“red”、“green”、“blue”、“cyan”等,那么您可以将它们与空格连接并存储一个字符串:

"red green blue cyan"

(当然,您必须添加代码以在需要单独颜色的地方再次将它们分开)。

假设您想使用谓词来查找那些带有“green”或“blue”的对象。然后,您将按照以下方式构造谓词:

colourString CONTAINS "blue" OR colourString CONTAINS "green"

如果您的字符串或搜索条件更复杂,则可能需要使用不同的连接方式。例如,如果您有多个单词的颜色,如“淡绿色”、“淡黄色”,则搜索“绿色”可能会匹配“深绿色”、“淡绿色”等(可能是好也可能是坏)。如果这很糟糕,您可能需要使用不同的分隔符(例如逗号),那么您的字符串可能是:

"red,blue,pale green,cyan"

而您找到“绿色”而不是“淡绿色”颜色的谓词将是:

colourString CONTAINS ",green,"

虽然有“绿色”是第一个或最后一个颜色的讨厌的边缘情况,所以你需要在你的 colourString 中包含一个前导和尾随逗号:

",red,blue,pale green,cyan,"

这开始变得越来越混乱。如果您的字符串可能已经包含逗号,则需要不同的分隔符和更复杂的谓词。根据您的数据,多对多关系可能更容易。

【讨论】:

  • 感谢您的详细解释!我根本不知道“可转换”的意思是“转换为 NSData”。