NSPredicate与NSSet的字符串匹配

时间:2010-08-04 19:26:42

标签: cocoa nspredicate core-data

我正在尝试使用NSPredicate来搜索生成的CoreData对象数组的字符串匹配:

// Grab an array of all Company projects
NSArray *array = [[company projects] allObjects];

我使用以下谓词来匹配任何项目名称,公司名称或客户端名称与不区分大小写的字符串(注意:这应该允许部分匹配,以便'App'将匹配'Apple Inc.'等) :

(name LIKE[cd] %@) OR (ANY companies.name LIKE[cd] %@) OR (ANY companies.clients.name LIKE[cd] %@)

谓词中提到的CoreData关系如下所示:

SELF -> (NSString *) name
SELF -> (NSSet *) companies -> (NSString *) name
SELF -> (NSSet *) companies -> (NSSet *) -> clients -> (NSString *) name

每当我尝试按上述谓词进行过滤时,我会在控制台中找到以下内容:

HIToolbox: ignoring exception 'Can't do regex matching on object {(
    "Apple Inc.",
"Test Co.",
Microsoft
)}.'

如果我理解正确,看起来好像尝试匹配密钥路径“companies.clients.name”会返回一个NSSet(或其他对象),其中需要NSString(名称)。

我做错了什么?

1 个答案:

答案 0 :(得分:4)

companies.clients.name将返回NSSet s的集合,其中集合中的每个元素都是一个公司客户名称的内容(即NSSet)。您可能希望在谓词字符串中使用companies.@unionOfSets.clients.names

请参阅键值编码中使用Set and Array Operators的指南。