iOS 之谓词 NSPredicate

NSPredicate:谓词

NSPredicate的具体用途应该还是过滤,类似于过滤条件之类的。

一、NSpredicate的创建:

NSpredicate *predicate  = [NSpredicate  predicateWithFormat:@"age > 28"];

//筛选条件       predicateWithFormat:为类方法 ,不需要我们管理内存。

二、NSpredicate中主要的几种运算方式

     1、比较运算符 > 、< 、== 、 >= 、<= 、 !=
          例:@"number >= 99"

2、逻辑运算符:AND、OR、NOT 这几个运算符计算并、或、非的结果。

3、范围运算符:IN 、BETWEEN
          例:@"number BETWEEN {1,5}"
                @"address IN {‘shanghai‘,‘nanjing‘}"

  4、字符串本身:SELF
          例:@"SELF == ‘APPLE‘"

     5、字符串相关:BEGINSWITH、ENDSWITH、CONTAINS
          例: @"name CONTAIN[cd] ‘ang‘" //包含某个字符串
                @"name BEGINSWITH[c] ‘sh‘" //以某个字符串开头
                @"name ENDSWITH[d] ‘ang‘" //以某个字符串结束
         注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。

     6、通配符:LIKE
        例:@"name LIKE[cd] ‘*er*‘" //*代表通配符,Like也接受[cd].
              @"name LIKE[cd] ‘???er*‘"

     7、正则表达式:MATCHES
          例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
               @"name MATCHES %@",regex

三、如何使用NSPredicate对一个自定义的实体进行筛选

创建一个实体类 Person

@interface Person : NSManagedObject
@property (nonatomic, retain) NSNumber * age;
@property (nonatomic, retain) NSString * firstname;
@property (nonatomic, retain) NSString * lastname;
@end

我们创建5个Person类的实体

    Person *person1   = [Person new];
    person1.age       = @21;
    person1.lastname  = @"zhang";
    person1.firstname = @"san";

    Person *person2   = [Person new];
    person2.age       = @25;
    person2.lastname  = @"li";
    person2.firstname = @"si";

    Person *person3   = [Person new];
    person3.age       = @31;
    person3.lastname  = @"wang";
    person3.firstname = @"wu";
    Person *person4   = [Person new];
    person4.age       = @35;
    person4.lastname  = @"zhao";
    person4.firstname = @"liu";

    Person *person5   = [Person new];
    person5.age       = @41;
    person5.lastname  = @"test";
    person5.firstname = @"san";

然后创建一个数组将这个对象全部存进去

    NSArray *personArray = [NSArray arrayWithObjects:person1,person2,person3,person4,person5, nil];

使用NSPredicate进行筛选

  //创建谓词的对象 谓词条件是基于KVC的,
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"lastname=‘wang‘ AND firstname==‘wu‘"];
    for(Person * person in personArray)
    {
        if([predicate evaluateWithObject: person])
        {
            NSLog(@" person.lastname =  %@",person.lastname);
        }
    }

打印结果是:person.lastname = wang

NSPredicate筛选一个对象逻辑还是很清晰的,不过这里比较麻烦的就是 还有一个循环,这里我们会发现数组提供了

一个方法可以更方便的检索数组对象

如下:

  NSArray *arrayPre=[personArray filteredArrayUsingPredicate: predicate];
    for (PersonOne *person in arrayPre) {
        NSLog(@"person.lastname = %@", person.lastname);
    }

看到这里发现NSPredicate 可以用于自定义的实体的检索、筛选,那如果用于 NSString,NSInteger,bool呢?

那我们再看一段代码吧:

    NSArray *arrays        = [NSArray arrayWithObjects: @"JK_RUI", @"KERP", @"SOFT", nil];
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF==‘SOFT‘"];
    NSArray *resultArr     = [arrays filteredArrayUsingPredicate:predicate];
    for (NSString *tempStr in resultArr) {
    NSLog(@"tempStr        = %@", tempStr);
    }

打印结果:tempStr    = SPOFT

四、使用NSPredicate在两个数组之间进行差异筛 

NSArray* array            = @[@"apple",@"iPhone"];
NSArray* array2           = @[@"apple",@"iPhone",@"ipad",@"mac"];
NSPredicate* thePredicate = [NSPredicate predicateWithFormat:@"NOT(SELF in %@)",array];
NSArray* arr3             = [array2 filteredArrayUsingPredicate:thePredicate];
NSLog(@"arr3=%@",arr3);

上面的代码输出结果 arr3={@"ipad" ,@"mac"}

五、如何正确使用正则筛选一个数组

NSString *regex  = @"^A.+e$";//以A 开头,以e 结尾的字符。
NSPredicate *pre = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
if([pre evaluateWithObject: @"Apple"]){
    printf("YES\n");
}else{
    printf("NO\n");
}

六、关于NSPredicate的其他说明和注意事项,以及技巧

1、动态属性名

假设你的代码如下

NSPredicate *p = [NSPredicate predicateWithFormat:@"name = %@", @"name1"]; 
显然代码没有任何问题,但是这个不是最好的写法我建议如下写法:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];

这样看上去可能会让代码逻辑更清晰。

2、当过滤条件字段都是动态的时候

    NSString *key = @"name";
    NSString *value = @"name1";
    NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ = %@", key, value];

然后当你执行到第三行的时候代码就会报错!
   逻辑上没错误啊!!!为什么会出错呢?
   NSPredicate要自动添加引号,所以最后得到的格式应该是@"‘name‘ = ‘name1‘"。明显不对。要做的就是:

NSPredicate *p = [NSPredicate predicateWithFormat:@"%K = %@", key, value]; 

总结:

NSPredicate的简单的使用就介绍到这里,这里有些都是从网络上或者是其他的博客上看到的,以后有新的需求再进行完善。

时间: 2024-10-10 13:39:08

iOS 之谓词 NSPredicate的相关文章

iOS:转载:IOS谓词--NSPredicate

IOS谓词--NSPredicate 分类: IOS应用2013-02-19 17:24 6792人阅读 评论(1) 收藏 举报 Cocoa 提供了NSPredicate 用于指定过滤条件,谓词是指在计算机中表示计算真假值的函数,它使用起来有点儿像SQL 的查询条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的正则匹配.首先我们看一个非常简单的例子,对谓词有一个认知.#import <Foundation/Foundation.h>@interface Person: NSObje

【转】IOS 学习之 NSPredicate 模糊、精确、查询

转自:http://blog.csdn.net/lianbaixue/article/details/10579117 简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取. 定义(最常用到的方法): NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...]; Format:(1)比较运算符>,<,==,>=,<=,!=可用于数值及字

iOS中谓词的使用

Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数.在cocoa中封装的一个数据库框架cocoaData里面 在进行查询(包括模糊查询)时同样会要用到谓词:下面对谓词的使用方法及规则进行简要的介绍下: 1,用predicateWithFormat创建一个谓词 条件 NSString *predicateString [email protected]"name=

OC学习篇之---谓词(NSPredicate)

在前一篇文章中我们介绍了OC中一个重要技术通知:http://blog.csdn.net/jiangwei0910410003/article/details/41923401,今天我们在来看一下OC中给我们提供的一个技术:谓词(NSPredicate) OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤出我们想要的数据.非常方便.在Java中是没

(转载)OC学习篇之---谓词(NSPredicate)

在前一篇文章中我们介绍了OC中一个重要技术通知,今天我们在来看一下OC中给我们提供的一个技术:谓词(NSPredicate) OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤出我们想要的数据.非常方便.在Java中是没有这种技术的,但是有开源的框架已经实现了此功能. 下面来看一下具体的例子吧: Person.h 1 // 2 // Person.

OC中给我们提供的一个技术:谓词(NSPredicate).note

OC中给我们提供的一个技术:谓词(NSPredicate)OC中的谓词操作是针对于数组类型的,他就好比数据库中的查询操作,数据源就是数组,这样的好处是我们不需要编写很多代码就可以去操作数组,同时也起到过滤的作用,我们可以编写简单的谓词语句,就可以从数组中过滤出我们想要的数据.非常方便.在Java中是没有这种技术的,但是有开源的框架已经实现了此功能. 下面来看一下具体的例子吧: Person.h objc]  view plaincopy  1. //   2. //  Person.h   3.

IOS开发之NSPredicate谓词的用法

编程的人员不管是上过大学还是从培训机构出来的都应该SQL语句有所了解,我们知道,在SQL语句当中 where 条件表达式可以对二维关系表的数据做条件筛选.微软的C# .net中也实现了功能能和SQL语句相媲美的技术,它就是List泛型集合的Lambda表达式,支持查找.排序.比较.组合等.在java中虽然没有在语言中集成对List对象的操作的实现,但是第三方开源库同样实现了这一功能.在IOS开发Cocoa框架中提供了一个功能强大的类NSPredicate,下面来讨论一下它的强大之处在哪...NS

iOS中的谓词NSPredicate的使用

今天写一篇关于iOS中关于谓词一些用法,我们先来看苹果官方给出的解释: The NSPredicate class is used to define logical conditions used to constrain a search either for a fetch or for in-memory filtering. You use predicates to represent logical conditions, used for describing objects i

iOS之谓词(NSPredicate)(正则表达式和UIBarController)

iOS之NSPredicate(正则表达式和UIBarController) 本文转发至:https://segmentfault.com/a/1190000000623005 NSPredicate,这个类和我上一篇博文中提到的valueForKeyPath一样很强大.它的使用主要集中在两个方法中 NSArray - (NSArray *)filteredArrayUsingPredicate:(NSPredicate *)predicate; NSMutableArray - (void)f