使用集合交集的CoreData获取谓词



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

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

但是它总是评估为CCD_ 6
如果我对该谓词进行注释,则未筛选的对象将被正确提取
我读了很多与这个主题相关的SO问答,例如这个。但是它不起作用
我知道,如果我的属性setOfStrings是一个关系,我可以使用子查询来获取正确的对象,如下所示。但我没有关系,只是一组字符串
我也读过这篇文章,上面写着

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

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

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

但这取决于字符串的细节。例如,如果它们是单个单词,就像颜色一样:;红色"绿色"蓝色"青色";,等等,然后你可以用空格将它们连接起来,并存储一个字符串:

"red green blue cyan"

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

假设你想使用一个谓词来找到那些带有"或"的对象;绿色";或";蓝色";。然后,您将按照以下行构建一个谓词:

colourString CONTAINS "blue" OR colourString CONTAINS "green"

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

"red,blue,pale green,cyan"

和你的谓词找到颜色";绿色";,但不是";淡绿色";将是:

colourString CONTAINS ",green,"

尽管随后存在令人讨厌的边缘情况;绿色";是第一种或最后一种颜色,因此您需要在颜色中包含前导和尾随逗号String:

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

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

最新更新