用引号字符搜索崩溃

时间:2012-12-06 09:52:44

标签: ios core-data nspredicate

我有一个搜索字段,使用以下内容针对CoreData触发文本:

produkt.name CONTAINS[cd] %@

但是当用户输入'时会崩溃,因为'字符会弄乱我的查询:

  

由于未捕获的异常而终止应用程序NSInvalidArgumentException
  原因:无法解析格式字符串produkt.name CONTAINS [cd]。

CoreData中没有可以处理的选项吗?我无法想象我必须自己逃避它?

4 个答案:

答案 0 :(得分:2)

您不应该对字符进行任何替换。我猜你正在创建这样的谓词:

NSString *s = [NSString stringWithFormat:@"produkt.name CONTAINS[cd] '%@'", term];
NSPredicate *p = [NSPredicate predicateWithFormat:s];

这是不正确的。您需要做的就是:

NSPredicate *p = [NSPredicate predicateWithFormat:@"produkt.name CONTAINS[cd] %@", term];

无论搜索词中是否有任何单引号等,它都可以正常工作。

答案 1 :(得分:0)

您可以将字符串'替换为字符串'',例如

string = [string stringByReplacingOccurrencesOfString:@"'" withString:@"''"];

答案 2 :(得分:0)

我认为,它将照顾到这一点。

以下是我尝试的内容,并将哦'gd“作为搜索框中的字符串传递。

- (void) stringWithPredicateText : (NSString *)predicateText {

    if ([predicateText length] >0) {
        NSLog(@"predicateText = (%@)",predicateText);
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"location contains[cd] %@",predicateText];
        NSLog(@"Predicate = <%@>",predicate);
    }   

}

输出:

测试[52856:707] predicateText =(哦'gd“)

测试[52856:707]谓词=(位置包含[cd]“哦'gd \”“)

在这里您可以看到谓词文本和谓词正确形成,它已经处理'和'字符,我的应用程序不会崩溃。

答案 3 :(得分:-1)

如果您不需要搜索'字符,只需将其从文本字段委托回调中的搜索字段中排除:

- (BOOL)textField:(UITextField *)textField 
     shouldChangeCharactersInRange:(NSRange)range 
     replacementString:(NSString *)string {

   if ([string isEqualToString:@"'"]) return NO;
   return YES;
}

您还可以在构造谓词时直接删除有问题的字符。

[NSPredicate predicateWithFormat:@"produkt.name CONTAINS[cd] %@",
  [searchString stringByReplacingOccurrencesOfString:@"'" withString:@""]];