2

我正在使用 Core Data,并且在 fetch 请求中有这样的谓词:

NSString *predicateStr = [NSString stringWithFormat:@"name like[c] '%@'",name];
NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateStr];

这很有效,但有一个例外:有时名称可能以反斜杠(“\”)结尾,因为该部分是用户生成的,也可能来自应用程序外部。

当它发生时,我收到这样的错误:

由于未捕获的异常'NSInvalidArgumentException'而终止应用程序,原因:
'无法解析格式字符串“(name like [c]'mqcu \')”'

所以我尝试stringByReplacingOccurrencesOfString这样使用:

NSString *predicateStr = [NSString stringWithFormat:@"(name like[c] '%@')", [name stringByReplacingOccurrencesOfString:@"\\" withString:@"\\\\"]];

但后来我收到这样的错误:

由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:
“反斜杠是通配符,并且不能在字符串末尾未转义。”

如何正确转义反斜杠?

4

2 回答 2

3

您永远不应该使用stringWithFormat来构建谓词。stringWithFormat处理%Kand%@和引用与 不同predicateWithFormat,因此组合这些方法很容易失败(如您的情况)。

如果谓词具有仅在运行时才知道的可变部分,您可以使用它NSCompoundPredicate来动态创建复杂的谓词(例如,参见https://stackoverflow.com/a/13481452/1187415示例)。

于 2013-05-11T02:45:57.830 回答
0

根据您的需要,您可以使用 ==、BEGINSWITH、CONTAINS 等来构建谓词,而不是 LIKE。然后你就不用担心转义特殊字符了。

如果您使用 LIKE 或 MATCHES,则必须转义特殊字符。

于 2017-01-10T01:51:07.783 回答