问题描述
我的核心数据模型有一个实体,其属性 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 文件中。然后 上述查询最多适用于已加载到的对象 托管对象上下文,但不针对存储文件。
这显然与我的问题有关。但是,用一对多关系替换一组简单字符串的建议解决方案在我看来太复杂了。
我应该使用哪个谓词?
解决方法
恐怕基于可转换属性的谓词不能作为提取的一部分工作。您要么必须获取所有内容,然后在内存中过滤结果,要么使用不同类型的属性:一对多关系最好,但您可以将字符串连接成一个字符串并存储它.那么您的谓词可能会与此相反。
但这取决于字符串的细节。例如,如果它们是单个单词,如颜色:“红色”、“绿色”、“蓝色”、“青色”等,那么您可以将它们用空格连接起来并存储一个字符串:
"red green blue cyan"
(当然,您必须添加代码以在需要单独颜色的地方再次将它们分开)。
假设您随后想使用谓词来查找具有“绿色”或“蓝色”的对象。然后,您将按照以下方式构造一个谓词:
colourString CONTAINS "blue" OR colourString CONTAINS "green"
如果您的字符串或搜索条件更复杂,则可能需要采用不同的连接方式。例如,如果您有多个词的颜色,如“淡绿色”、“淡黄色”,则搜索“绿色”可能会匹配“深绿色”、“淡绿色”等(可能好也可能坏)。如果这不好,您可能需要使用不同的分隔符(例如逗号),那么您的字符串可能是:
"red,blue,pale green,cyan"
并且您找到颜色“绿色”而不是“淡绿色”的谓词是:
colourString CONTAINS ",green,"
虽然有一些令人讨厌的边缘情况,其中“绿色”是第一个或最后一个颜色,所以你需要在你的 colourString 中包含一个前导和尾随逗号:
",red,cyan,"
这开始变得越来越混乱。如果您的字符串可能已经包含逗号,则需要不同的分隔符和更复杂的谓词。根据您的数据,一对多关系可能更容易。