首页 > 代码库 > NSPredicate 的用法举例
NSPredicate 的用法举例
Cocoa 提供了一个名为NSPredicate的类,用于指定过滤器的条件,用NSPredicate描述查询方式,原理类似于在数据库中进行查询。可以在数据库风格的API中使用NSPredicate类,常见的用于Core Data和Spotlight。 本文讲解过程中用到了部分类比如garage(车库的类),car(车)等仅供举例,未列出创建代码,体会predicate的用法才是关键。
创建Predicate.
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'Herbie'"];
计算Predicate
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"engine.horsepowe > 150"]; NSArray *cars = [garage cars]; for (Car *car in [garage cars]) { if ([predicate evaluateWithObject:car]) { NSLog(@"%@",car.name); } }
遍历数组取出符合条件的对象。
数组过滤器
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"engine.horsepowe > 150"]; NSArray *results; results = [cars filteredArrayUsingPredicate:predicate];
假如你有一个可变数组,而且需要剔除不属于该数组的所有项目。使用以下方法:
NSMutableArray *carsCopy = [cars mutableCopy]; [carsCopy filterUsingPredicate:predicate];
构造灵活Predicate
有两种方式,
第一种 格式说明符
NSPredicate *predicate1, *predicate2, *predicate3; predicate1 = [NSPredicate predicateWithFormat:@"engine.horsepowe > %d",50]; predicate2 = [NSPredicate predicateWithFormat:@"name == %@",@"Herbie"]; predicate3 = [NSPredicate predicateWithFormat:@"%k == %@", @"name", @"Herbie"];
第二种 将变量名放入字符串中,类似于环境变量
NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"name == $NAME"]; NSDictionary *varDict; varDict = [NSDictionary dictionaryWithObjectsAndKeys:@"Herbie",@"NAME", nil]; NSPredicate *predicate = [predicateTemplate predicateWithSubstitutionVariables:varDict];
此predicate等价于第一种里的的predicate3和predicate2
predicateTemplate = [NSPredicate predicateWithFormat:@"engine.horsepower > $POWER"]; varDict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:150], @"POWER", nil]; predicate = [predicateTemplate predicateWithSubstitutionVariables:varDict];
而此predicate等价于第一种里的predicate1
predicate的运算符
支持C语言的常用运算符 == = > < >= <= != <> && || ! AND OR NOT等
predicate = [NSPredicate predicateWithFormat:@"(engine.horsepower > 50) AND (engine.horsepower < 200)"]; results = [cars filteredArrayUsingPredicate:predicate];
数组运算符
predicate = [NSPredicate predicateWithFormat:@"engine.horsepower BETWEEN{50,200}"];
等价于
NSArray *betweens = [NSArray arrayWithObjects:[NSNumber numberWithInt:50],[NSNumber numberWithInt:200],nil]; predicate = [NSPredicate predicateWithFormat:@"engine.horsepower BEWEEN %@",betweens];
SELF 关键词响应predicate计算对象
predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", names1]; results = [names2 filteredArrayUsingPredicate:predicate]; NSLog(@"%@", results);答案是:
(
Judge,
Badger
)
字符串运算符
BEGINSWITH 检查某个字符串是否以另一个字符串开头
ENDSWITH 检查某个字符串是否以另一个字符串结尾
CONTAINS 检查某个字符串是否在另一个字符串内部
比如使用 "name BEGINSWITH ‘Bad‘ " 匹配Badger
匹配是区分大小写的,如果匹配BADGer就匹配不得了
要忽视大小写及重音符等规则,可以前面加上[cd]
" name BEGINSWITH [cd] ‘HERB‘ " 匹配 Herbie 即可匹配成功 ,通常加上[cd]比较好
LIKE运算符
" name LIKE ‘ *er* ‘ "将会与任何含有er的名称匹配,等价于CONTAINS
" name LIKE ‘ ???er* ‘ "将会与Paper Car 匹配 但不会与Badger匹配,er前面限定了三个字符
如果你热衷于正则表达式,可以使用MATCHES 运算符,赋给它一个正则表达式。
转载请注明原著:http://blog.csdn.net/marvindev
NSPredicate 的用法举例
声明:以上内容来自用户投稿及互联网公开渠道收集整理发布,本网站不拥有所有权,未作人工编辑处理,也不承担相关法律责任,若内容有误或涉及侵权可进行投诉: 投诉/举报 工作人员会在5个工作日内联系你,一经查实,本站将立刻删除涉嫌侵权内容。