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 还支持字符串和数字字面量)
相关文章
正则替换html代码中img标签的src值在开发富文本信息在移动端...
正则表达式
AWK是一种处理文本文件的语言,是一个强大的文件分析工具。它...
正则表达式是特殊的字符序列,利用事先定义好的特定字符以及...
Python界一名小学生,热心分享编程学习。
收集整理每周优质开发者内容,包括、、等方面。每周五定期发...