使用引号字符搜索时崩溃

Posted

技术标签:

【中文标题】使用引号字符搜索时崩溃【英文标题】:Crash on search with quote character 【发布时间】:2012-12-06 09:52:44 【问题描述】:

我有一个搜索字段,并且使用以下命令针对 CoreData 触发文本:

produkt.name CONTAINS[cd] %@

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

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

CoreData 中没有选项可以处理这个问题吗?我无法想象我必须自己逃脱?

【问题讨论】:

搜索'应该没问题。请显示您如何创建谓词的代码。 【参考方案1】:

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

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

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

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

无论搜索词中的任何单引号等如何,这都将起作用。

【讨论】:

无法解析格式字符串 "(nachname CONTAINS[cd] 'M) OR (vorname CONTAINS[cd] 'M)"' 是由 [subString appendFormat:@"(%@ CONTAINS[ cd] %@) 或",列[i],短语]; else [subString appendFormat:@"(%@ CONTAINS[cd] %@)", columns[i],phrase]; @netshark1000 请在问题中发布您的谓词创建代码。像您正在做的那样附加格式是造成麻烦的原因,如果您发布代码,我可以向您展示如何解决它。【参考方案2】:

我想,它会解决这个问题的。

以下是我尝试过的,并将 Oh ' gd " 作为字符串传递到搜索框中。

- (void) stringWithPredicateText : (NSString *)predicateText 

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


输出:

Test[52856:707] predicateText = (Oh ' gd ")

Test[52856:707] 谓词 = (location CONTAINS[cd] "Oh ' gd \"")

在这里您可以看到谓词文本和谓词格式正确,它已经处理了 ' 和 " 字符,并且我的应用程序没有崩溃。

【讨论】:

【参考方案3】:

你可以用字符串''替换那个字符串',比如

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

【讨论】:

【参考方案4】:

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

- (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:@""]];

【讨论】:

如果用户应该能够搜索'? 根据你的问题,不是。

以上是关于使用引号字符搜索时崩溃的主要内容,如果未能解决你的问题,请参考以下文章

TableView 中的搜索栏:输入搜索文本字符串的最后一个字符时应用程序崩溃

在 findstr 搜索字符串中转义引号

在快速键入期间使用搜索栏进行搜索时 TableView 崩溃

当我在搜索栏中输入第一个字符时,我的应用程序崩溃了

在awk中搜索带双引号的字符串

grep命令 一 文本搜索工具