我有一个使用以下字符串构建的谓词
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"displayName == [cd] %@ AND emailAddress == [cd] %@" , displayName, emailAddress];
在运行我的应用程序时,我会定期找到一个陷阱,原因如下:
Fatal Exception NSInvalidArgumentException
unimplemented SQL generation for predicate : (0x64b5580 <x-coredata://3AA31AFB-35E4-468C-876D-03DEB56F38A3/aaa/p14> IN )
问题似乎是由在谓词语句中注入有效的SQL引起的。
此处推荐的解决方法是使用具有以下格式的谓词吗?
[NSPredicate predicateWithFormat:@"(displayName == [cd] \"%@\") AND (emailAddress == [cd] \"%@\")" , displayName, emailAddress];
即。用双引号包围搜索目标?或者这里推荐一些其他方法吗?
答案 0 :(得分:5)
如果您不确定值的完整性,请尝试使用NSCompoundPredicate
。仅当值有效时才将谓词添加到谓词数组,并从谓词数组创建AND
复合谓词
NSMutableArray *subPredicates = [NSMutableArray array];
if (displayName) {
[subPredicates addObject:[NSPredicate predicateWithFormat:@"displayName == [cd] %@",displayName]];
}
if (emailAddress) {
[subPredicates addObject:[NSPredicate predicateWithFormat:@"emailAddress == [cd] %@",emailAddress]];
}
NSPredicate *compoundPredicate = [NSCompoundPredicate andPredicateWithSubpredicates:subPredicates];