NSPredicate
前端之家收集整理的这篇文章主要介绍了
NSPredicate,
前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
Cocoa 提供了一个名为NSPredicate的类,用于指定过滤器的条件,用NSPredicate描述查询方式,原理类似于在数据库中进行查询。可以在数据库风格的API中使用NSPredicate类,常见的用于Core Data和Spotlight。Predicate是一个返回Boolean值的表达式,可以看做是if或while里面的条件表达式,Predicate不依赖于被搜索的具体数据,而是提供一种检索数据的抽象查询定义。 本文讲解过程中用到了部分类比如garage(车库的类),car(车)等仅供举例,未列出创建代码,体会predicate的用法才是关键。
创建Predicate.
- NSPredicate*predicate=[NSPredicatepredicateWithFormat:@"name=='Herbie'"];
计算Predicate
predicateWithFormat:@"engine.horsepowe>150"];
- NSArray*cars=[garagecars];
- for(Car*carin[garagecars]){
- if([predicateevaluateWithObject:car]){
- NSLog(@"%@",car.name);
- }
- }
遍历数组取出符合条件的对象。
数组过滤器
NSArray*results;
- results=[carsfilteredArrayUsingPredicate:predicate];
假如你有一个可变数组,而且需要剔除不属于该数组的所有项目。使用以下
方法:
NSMutableArray*carsCopy=[carsmutableCopy];
- [carsCopyfilterUsingPredicate:predicate];
构造灵活Predicate
有两种方式,
第一种 格式说明符
NSPredicate*predicate1,*predicate2,*predicate3;
-
- predicate1=[NSPredicatepredicateWithFormat:@"engine.horsepowe>%d",50];
- predicate2=[NSPredicatepredicateWithFormat:@"name==%@",@"Herbie"];
- predicate3=[NSPredicatepredicateWithFormat:@"%k==%@",@"name",@"Herbie"];
第二种 将变量名放入字符串中,类似于环境变量
此predicate等价于第一种里的的predicate3和predicate2
NSPredicate*predicateTemplate=[NSPredicatepredicateWithFormat:@"name==$NAME"];
- NSDictionary*varDict;
- varDict=[NSDictionarydictionaryWithObjectsAndKeys:@"Herbie",@"NAME",nilnil];
-
- NSPredicate*predicate=[predicateTemplatepredicateWithSubstitutionVariables:varDict];
而此predicate等价于第一种里的predicate1
predicateTemplate=[NSPredicatepredicateWithFormat:@"engine.horsepower>$POWER"];
- varDict=[NSDictionarydictionaryWithObjectsAndKeys:[NSNumbernumberWithInt:150],@"POWER",153); font-weight:bold; background-color:inherit">nil];
- predicate=[predicateTemplatepredicate的运算符
支持C语言的常用运算符 == = > < >= <= != <> && || ! AND OR NOT等
predicate=[NSPredicatepredicateWithFormat:@"(engine.horsepower>50)AND(engine.horsepower<200)"];
- results=[cars数组运算符
predicateWithFormat
:@"engine.horsepowerBETWEEN{50,200}"];
等价于
NSArray*betweens=[NSArrayarrayWithObjects:[NSNumbernumberWithInt:50],[NSNumbernumberWithInt:200], predicate=[NSPredicatepredicateWithFormat:@"engine.horsepowerBEWEEN%@",betweens];
SELF 关键词响应predicate计算对象
NSArray*names1=[NSArrayarrayWithObjects:@"Herbie",@"Badger",@"Judge",@"Elvis",153); font-weight:bold; background-color:inherit">nilnil];
- NSArray*names2=[NSArrayarrayWithObjects:@"Judge",@"PaperCar",@"Phoenix",0); background-color:inherit">nil];
- predicateWithFormat:@"SELFIN%@",0); background-color:inherit">names1];
- results=[names2filteredArrayUsingPredicate:predicate];
- NSLog(@"%@",results);
答案是:
(
Judge,
Badger
)
字符串运算符
BEGINSWITH 检查某个字符串是否以另一个字符串开头
ENDSWITH 检查某个字符串是否以另一个字符串结尾
CONTAINS 检查某个字符串是否在另一个字符串内部
比如使用 "name BEGINSWITH 'Bad' " 匹配Badger
匹配是区分大小写的,如果匹配BADGer就匹配不得了
" 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
CoreData Prdicate 支持的运算符和参数
Basic Comparisons: =,==,>=,=>,<=,=<,>,<,!=,<>,BETWEEN{low,high}
Boolean: AND (&&),OR(||),NOT(!)
String: BEGINSWITH,CONTSINS,ENDSWITH,LIKE,MATCHES
Aggregate: ANY,SOME,ALL,NONE,IN
Literals: FALSE,NO,TRUE,YES,NULL,NIL,SELF. (Core data 还支持字符串和数字字面量)