我有一个搜索字段,使用以下内容针对CoreData触发文本:
produkt.name CONTAINS[cd] %@
但是当用户输入'
时会崩溃,因为'
字符会弄乱我的查询:
由于未捕获的异常而终止应用程序NSInvalidArgumentException
原因:无法解析格式字符串produkt.name CONTAINS [cd]。
CoreData中没有可以处理的选项吗?我无法想象我必须自己逃避它?
答案 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:@""]];