2012-12-06 104 views
0

我有一个搜索栏和文本是通过对CoreData解雇搜索:崩溃与引号字符

produkt.name CONTAINS[cd] %@ 

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

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

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

+0

搜索'''应该没问题。请显示代码如何创建谓词。 –

回答

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 \ “”)

在这里你可以看到谓词文本和谓语AR e正确组建,它已经在照顾'和'角色,而我的应用不会崩溃。

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

以及如果用户应该能够搜索'? – netshark1000

+0

-1当构造谓词时,这是不必要的 –

+0

根据你的问题,它不是。 – Mundi

0

您可以替换字符串'用绳子'',像

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

-1构造谓词时,这是不必要的 –

2

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

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

这将是不正确的。所有你需要做的是这样的:

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

这将工作,无论任何单引号等在搜索词。

+0

无法解析格式字符串“(nachname CONTAINS [cd]'M)OR(vorname CONTAINS [cd]'M)”'由[subString appendFormat:@“(%@ CONTAINS [cd]%@)OR“,栏[i],词组]; } 其他{ [subString appendFormat:@“(%@ CONTAINS [cd]%@)”,columns [i],phrase]; – netshark1000

+0

@ netshark1000请在问题中发布您的谓词创建代码。像你一样追加格式是造成你的麻烦的原因,如果你发布了代码,我可以告诉你如何解决它。 –