6

现在我在 NSPredicate 中面临单引号 ( ' ) 问题。

这是我的查询:

 NSPredicate *query = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"s_name='%@' AND s_regno=%d",Name,[RegNo intValue]]];

当我使用名称“John”进行过滤时,一切正常,完全没有错误。但我用的名字是“Mary ' Monny”。有错误。

我怀疑这是因为单引号。请帮助我如何克服这个问题。

谢谢

4

2 回答 2

14

作为快速修复,您根本不需要该NSString部件。这种替换是predicateWithFormat:方法的重点!只需使用:

NSPredicate *query = [NSPredicate predicateWithFormat:@"s_name == %@ AND s_regno == %d", Name, [RegNo intValue]];

我喜欢完全避免使用格式字符串,而是在代码中构建谓词。

NSPredicate *nameQuery =
[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"s_name"]
                                   rightExpression:[NSExpression expressionForConstantValue:Name]
                                          modifier:NSDirectPredicateModifier
                                              type:NSLikePredicateOperatorType
                                           options:NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption];

NSPredicate *regNoQuery =
[NSComparisonPredicate predicateWithLeftExpression:[NSExpression expressionForKeyPath:@"s_regno"]
                                   rightExpression:[NSExpression expressionForConstantValue:RegNo]
                                          modifier:NSDirectPredicateModifier
                                              type:NSEqualToPredicateOperatorType
                                           options:0];

NSPredicate *query = [NSCompoundPredicate andPredicateWithSubpredicates:@[nameQuery,regNoQuery]];

请注意,我添加NSCaseInsensitivePredicateOption|NSDiacriticInsensitivePredicateOption了对名称进行不区分大小写和变音符号的比较,如s_name like[cd] %@. 如果不需要,当然可以使用type:NSEqualToPredicateOperatorTypeand options:0

于 2013-01-02T02:40:28.273 回答
1

如果 name = @"Bell's",你可以尝试这样做谓词:

NSPredicate *query = [NSPredicate predicateWithFormat:@"name == \"%@\"", name];  

只需将标准单引号替换为双引号即可。

于 2013-11-21T15:18:01.773 回答