CoreData 使用集合交集获取谓词
CoreData fetch predicate using a set intersection
我的核心数据模型有一个实体,其属性 setOfStrings
类型为 Transformable
。
对应的class有一个属性@NSManaged var setOfStrings: Set<String>?
.
我想使用过滤掉属性 setOfStrings
与给定集合有集合交集的对象的谓词来获取对象,比如 givenSet
.
我尝试使用以下谓词:
NSPredicate(format: "ANY setOfStrings IN %@", givenSet)
但它的计算结果总是 false
。
如果我注释掉这个谓词,未过滤的对象将被正确获取。
我读了很多与这个主题相关的 SO Q/A,例如this one。然而它不起作用。
我知道,如果我的属性 setOfStrings
是一个关系,我可以使用子查询来获取正确的对象,如 here 所示。但是我没有关系,只是一组字符串。
我也读过 this post 说
I assume that the set is defined as a transformable property, which
means that it is stored as a binary archive in the SQLite file. Then
the above queries will work at most for objects already loaded into
the managed object context, but not against the store file.
这显然与我的问题有关。但是用一对多关系替换一组简单字符串的建议解决方案在我看来太复杂了。
我应该使用哪个谓词?
恐怕基于可转换属性的谓词不能作为提取的一部分工作。您要么必须获取所有内容,然后在内存中过滤结果,要么使用不同类型的 属性:一对多关系最好,但您可以将字符串连接成一个字符串并存储它。那么你的谓词可能会反对它。
但这取决于字符串的细节。例如,如果它们是单个单词,如颜色:“red”、“green”、“blue”、“cyan”等,那么您可以将它们与空格连接起来并存储一个字符串:
"red green blue cyan"
(当然,如果需要单独的颜色,您还必须添加代码以再次将它们分开)。
假设您随后想要使用谓词来查找具有“绿色”或“蓝色”的对象。然后,您将按照这些行构造一个谓词:
colourString CONTAINS "blue" OR colourString CONTAINS "green"
如果您的字符串或搜索条件更复杂,则可能需要不同的连接方式。例如,如果您有多个词的颜色,如“pale green”、“pale yellow”,则搜索“green”可能会匹配“dark green”、“pale green”等(可能好也可能坏)。如果那不好,您可能需要使用不同的分隔符(例如逗号),那么您的字符串可能是:
"red,blue,pale green,cyan"
你找到颜色“绿色”而不是“淡绿色”的谓词是:
colourString CONTAINS ",green,"
虽然有一些令人讨厌的边缘情况,其中“绿色”是第一种或最后一种颜色,因此您需要在 colourString 中包含前导和尾随逗号:
",red,blue,pale green,cyan,"
开始变得越来越乱。如果您的字符串可能已经包含逗号,则将需要不同的分隔符和更复杂的谓词。根据您的数据,一对多关系可能更容易。
我的核心数据模型有一个实体,其属性 setOfStrings
类型为 Transformable
。
对应的class有一个属性@NSManaged var setOfStrings: Set<String>?
.
我想使用过滤掉属性 setOfStrings
与给定集合有集合交集的对象的谓词来获取对象,比如 givenSet
.
我尝试使用以下谓词:
NSPredicate(format: "ANY setOfStrings IN %@", givenSet)
但它的计算结果总是 false
。
如果我注释掉这个谓词,未过滤的对象将被正确获取。
我读了很多与这个主题相关的 SO Q/A,例如this one。然而它不起作用。
我知道,如果我的属性 setOfStrings
是一个关系,我可以使用子查询来获取正确的对象,如 here 所示。但是我没有关系,只是一组字符串。
我也读过 this post 说
I assume that the set is defined as a transformable property, which means that it is stored as a binary archive in the SQLite file. Then the above queries will work at most for objects already loaded into the managed object context, but not against the store file.
这显然与我的问题有关。但是用一对多关系替换一组简单字符串的建议解决方案在我看来太复杂了。
我应该使用哪个谓词?
恐怕基于可转换属性的谓词不能作为提取的一部分工作。您要么必须获取所有内容,然后在内存中过滤结果,要么使用不同类型的 属性:一对多关系最好,但您可以将字符串连接成一个字符串并存储它。那么你的谓词可能会反对它。
但这取决于字符串的细节。例如,如果它们是单个单词,如颜色:“red”、“green”、“blue”、“cyan”等,那么您可以将它们与空格连接起来并存储一个字符串:
"red green blue cyan"
(当然,如果需要单独的颜色,您还必须添加代码以再次将它们分开)。
假设您随后想要使用谓词来查找具有“绿色”或“蓝色”的对象。然后,您将按照这些行构造一个谓词:
colourString CONTAINS "blue" OR colourString CONTAINS "green"
如果您的字符串或搜索条件更复杂,则可能需要不同的连接方式。例如,如果您有多个词的颜色,如“pale green”、“pale yellow”,则搜索“green”可能会匹配“dark green”、“pale green”等(可能好也可能坏)。如果那不好,您可能需要使用不同的分隔符(例如逗号),那么您的字符串可能是:
"red,blue,pale green,cyan"
你找到颜色“绿色”而不是“淡绿色”的谓词是:
colourString CONTAINS ",green,"
虽然有一些令人讨厌的边缘情况,其中“绿色”是第一种或最后一种颜色,因此您需要在 colourString 中包含前导和尾随逗号:
",red,blue,pale green,cyan,"
开始变得越来越乱。如果您的字符串可能已经包含逗号,则将需要不同的分隔符和更复杂的谓词。根据您的数据,一对多关系可能更容易。