NSPredicate逃避反斜杠字符

时间:2013-10-02 20:47:19

标签: objective-c macos cocoa core-data nspredicate

我有以下代码:

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name like[c] %@", projectName];
[fetchRequest setPredicate:predicate];
[moc executeFetchRequest:request error:error]; // moc & error are defined elsewhere

当我使用projectName为“asdf”运行此代码时,一切都很好。但是,当该值设置为“asdf”时(注意结尾处的反斜杠),会出现以下异常:

*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'The backslash is a wildcard char, and cannot appear unescaped at the end of a string.'

po request 为我提供了以下信息:

po request
<NSFetchRequest: 0x101348ee0> (entity: Project; predicate: (name LIKE[c] "asdf\\"); sortDescriptors: ((null)); type: NSManagedObjectResultType; )

对我来说这是一个简单的问题,但无法在互联网上找到解决方案,谁知道呢?

1 个答案:

答案 0 :(得分:5)

谓词中的

LIKE处理*?作为通配符, 其中?匹配1个字符,*匹配0个或更多字符。这些通配符 字符可以转义 \*\?,以便逐字匹配星号或问号。

因此,反斜杠本身必须在“LIKE”查询中以\\转义 匹配单个反斜杠。搜索模式末尾的单反斜杠 导致错误(这就是你的情况)。

如果您不需要通配符处理,则可以使用==BEGINSWITHCONTAINS代替。 所有这些都可以与[c]结合使用。