NSPredicate

Cocoa 提供了一个名为nspredicate的类,用于指定过滤器的条件,用nspredicate描述查询方式,原理类似于在数据库中进行查询。可以在数据库风格的API中使用nspredicate类,常见的用于Core Data和Spotlight。Predicate是一个返回Boolean值的表达式,可以看做是if或while里面的条件表达式,Predicate不依赖于被搜索的具体数据,而是提供一种检索数据的抽象查询定义。 本文讲解过程中用到了部分类比如garage(车库的类),car(车)等仅供举例,未列出创建代码,体会predicate的用法才是关键。


创建Predicate.

[objc] view plain copy
  1. nspredicate*predicate=[nspredicatepredicateWithFormat:@"name=='Herbie'"];

计算Predicate

    predicateWithFormat:@"engine.horsepowe>150"];
  1. NSArray*cars=[garagecars];
  2. for(Car*carin[garagecars]){
  3. if([predicateevaluateWithObject:car]){
  4. NSLog(@"%@",car.name);
  5. }
  6. }

遍历数组取出符合条件的对象。


数组过滤器

    NSArray*results;
  1. results=[carsfilteredArrayUsingPredicate:predicate];

假如你有一个可变数组,而且需要剔除不属于该数组的所有项目。使用以下方法

    NSMutableArray*carscopy=[carsmutablecopy];
  1. [carscopyfilterUsingPredicate:predicate];

构造灵活Predicate

有两种方式,

第一种 格式说明符

    nspredicate*predicate1,*predicate2,*predicate3;
  1. predicate1=[nspredicatepredicateWithFormat:@"engine.horsepowe>%d",50];
  2. predicate2=[nspredicatepredicateWithFormat:@"name==%@",@"Herbie"];
  3. predicate3=[nspredicatepredicateWithFormat:@"%k==%@",@"name",@"Herbie"];

第二种 将变量名放入字符串中,类似于环境变量

此predicate等价于第一种里的的predicate3和predicate2

    nspredicate*predicateTemplate=[nspredicatepredicateWithFormat:@"name==$NAME"];
  1. NSDictionary*varDict;
  2. varDict=[NSDictionarydictionaryWithObjectsAndKeys:@"Herbie",@"NAME",nilnil];
  3. nspredicate*predicate=[predicateTemplatepredicateWithSubstitutionVariables:varDict];


而此predicate等价于第一种里的predicate1

    predicateTemplate=[nspredicatepredicateWithFormat:@"engine.horsepower>$POWER"];
  1. varDict=[NSDictionarydictionaryWithObjectsAndKeys:[NSNumbernumberWithInt:150],@"POWER",153); font-weight:bold; background-color:inherit">nil];
  2. predicate=[predicateTemplatepredicate的运算符

    支持C语言的常用运算符 == = > < >= <= != <> && || ! AND OR NOT等

      predicate=[nspredicatepredicateWithFormat:@"(engine.horsepower>50)AND(engine.horsepower<200)"];
    1. 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];
      1. NSArray*names2=[NSArrayarrayWithObjects:@"Judge",@"PaperCar",@"Phoenix",0); background-color:inherit">nil];
      2. predicateWithFormat:@"SELFIN%@",0); background-color:inherit">names1];
      3. results=[names2filteredArrayUsingPredicate:predicate];
      4. 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


      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界一名小学生,热心分享编程学习。
      收集整理每周优质开发者内容,包括、、等方面。每周五定期发...