刚才遇到一个有意思的问题,NSPredicate为什么使用like进行条件匹配时无法识别出结果。
研究一番获得解决方法,记录在这里:
首先NSPredicate初始化时候,使用的Format的语句,并不是标准的NSString,所以其中的%@和%k,是NSPredicate特殊定义的含义,与通常意义的NSString并不一致。
所以很多人下意识可能会写出如下语句:
[NSPredicate predicateWithFormat:@"%k like[cd] %@ ", Attri_Name, keyword];
但是这种查询会直接崩溃,当你上网搜索一下,可能会改进一下,写出下面的条件查询。
[NSPredicate predicateWithFormat:@"%k like[cd] '*%@*' ", Attri_Name, keyword];
这种情况下,运行正常,但你会发现匹配不到结果。
其实,我们需要这么做:
NSString *key = [NSString stringWithFormat:@"*%@*",keyword];
[NSPredicate predicateWithFormat:@"%k like[cd] %@ ", Attri_Name, key];
也就是说,你需要直接将查询的限定条件,以一个字符串的对象传给NSPredicate才能解析,而不能指望NSPredicate给你处理。
NSPredicate的Like,一般适合用于使用?号来匹配精确的前后置字符数量条件,像上面这种前后*的条件,其实可以直接使用CONTAINS查询替换。
不错不错!内容感觉好极了!