关于谓词NSPredicate的使用

    关于NSPredicate的使用,网上已经有很多文章,有一些很不错,之前看的就是这篇:点击打开链接 。根据自己的使用总结下:

    我主要是用在对数组的筛选上,相对循环数组然后自己去匹配,要简洁得多。而且对于数组里面嵌套字典或对象的结构很好。

   1、 NSPredicate的构建:

     NSPredicate * filterPredicate = [NSPredicatepredicateWithFormat:@"label.text == '3' "];

   使用一段字符串构建,是一段匹配性质的字符串,类似SQL的用法。我的理解是,这段字符串可以分为3个部分,左边是用来匹配的东西,右边是被匹配的目标值,中间用来指定用什么关系来匹配。所以也按着这个思路来说NSPredicate的构建。

  (1)用来匹配的东西:

       SELF 关键词可以用来指定自身,除此之外就是变成自身的属性进行匹配。

- (void)demo_method{
    NSArray * arr = @[@{@"num":@1},@{@"num": @2},@{@"num": @3},@{@"num": @4}];
    NSPredicate * arrPredicate = [NSPredicate predicateWithFormat:@"num = 3"];
    
    NSArray * filteredArr = [arr filteredArrayUsingPredicate:arrPredicate];
    NSLog(@"%@",filteredArr);
}
这里使用@“num = 3”;会将num当做键获取值,然后用这个值来进行匹配。因为对象的属性页可以通过ValueForKey获得,所以如果这里的数组里面是放了一个个的对象,而这个对象有一个属性num,依然可以使用这个 NSPredicate进行筛选。而且当数据嵌套很深时依然可以使用:

- (void)instancePredicate2{
    NSMutableArray * testArr = [[NSMutableArray alloc]initWithCapacity:4];
    for (int i = 0; i<15; i++) {
        UILabel * label  = [[UILabel alloc]init];
        label.text = [NSString stringWithFormat:@"%d",i];
        
        testObject * obj = [[testObject alloc]init];
        obj.label = label;
        [testArr addObject:obj];
    }
    NSLog(@"%@",testArr);
    
    NSPredicate * filterPredicate = [NSPredicate predicateWithFormat:@"label.text.length == 2"];
    NSArray * filteredArr = [testArr filteredArrayUsingPredicate:filterPredicate];
    NSLog(@"%@",((testObject *)filteredArr[0]).label);
}
testObject是自定义的一个类,只有一个UILabel * label的属性,数组里面添加的是 testObject对象,使用字符串为“label.text.length”可以一层层的向下获取属性,然后进行匹配,主要是这里可以使用.(点)这个字符,非常好。

 (2)进行匹配的关系以及对应的被匹配的目标值的写法:

  借鉴网上其他文章,有这些运算符:比较运算符>,<,==,>=,<=,!=  ,IN,BETWEEN, BEGINSWITH、ENDSWITH、CONTAINS,LIKE,MATCHES

  比较运算符没什么可多说的,

 IN:

 NSArray * arr = @[@214411,@12,@553,@34,@6335];  
 NSPredicate * pre = [NSPredicate predicateWithFormat:@"SELF IN %@",arr];
 flag = [pre evaluateWithObject:@214411]; //flag结果为YES

IN用于匹配在一个数组中是否存在特定的值或对象。也可以这样写:

NSPredicate * pre = [NSPredicate predicateWithFormat:@"SELF IN {214411,12,553,34,6335}"];
        flag = [pre evaluateWithObject:@214411];
或者使用类似stringWithFormater:的写法,在引号里面使用%@,外面跟上相应的对象,这样可以匹配任意类的对象:

NSPredicate * pre = [NSPredicate predicateWithFormat:@"SELF IN {%@,12,553,34,6335}",@214411];
BETWEEN:

和IN:可以用于数字、日期和字符串,用于判断指定的对象的值是否在给定的两者之间:

NSDateFormatter * formatter = [[NSDateFormatter alloc]init];
        [formatter setDateFormat:@"yyyy-MM-dd"];
        NSDate * date1 = [formatter dateFromString:@"2014-03-01"];
        NSDate * date2 = [formatter dateFromString:@"2014-05-01"];
        NSArray * arr = @[date1,date2];

        NSPredicate * pre = [NSPredicate predicateWithFormat:@"SELF BETWEEN %@",arr];
    
        flag = [pre evaluateWithObject:[formatter dateFromString:@"2014-4-22"]];
被匹配的目标值需要一个数组,而且是只有两个值的数组,都是数字或都是NSDate对象、或字符串。数字就是这两个数提供一个范围,比如3到10,日期也一样,不过字符串不清楚怎么用的。这例子里的日期需要自己构建,如果是在某个项目中已经有了日期和范围,那么两句话就可以判断指定日期是否在特定的范围内,还是很简洁的。

BEGINSWITH、ENDSWITH、CONTAINS:
这3个关键词分别匹配字符串是否已特定的字符串开头、结尾和包含特定字符串;如:@"name CONTAIN[cd] 'ang'";

[c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,也不区分发音符号。

LIKE:

LIKE用来匹配字符串,相对上面3个更灵活一些,如: @"name LIKE[cd] '???er*'";

?匹配单个字符,有几个?代表这个位置有几个字符,需要数量匹配上才可以,*匹配多个字符,只要这个位置有字符就可以。使用‘er*’就可以替代BEGINSWITH 。

MATCHES:

 这个关键词是用来匹配正则表达式的。


   以上说的都是一个条件,可以使用AND合并两个条件。


2、NSPredicate的使用:

   (1)用于过滤数组:NSPredicate构建之后,数组使用

NSArray * filteredArr = [testArr filteredArrayUsingPredicate:filterPredicate];
进行筛选。筛选之后的结果也是一个数组,因为可能会匹配多个值

    (2)对某个对象的的属性进行判断:

NSPredicate * pre = [NSPredicate predicateWithFormat:@"SELF BETWEEN %@",arr];
    
 flag = [pre evaluateWithObject:[formatter dateFromString:@"2014-4-22"]];


   最后,我认为大于小于、是否包含等判断可以不适用NSPredicate,因为这种判断本身很简单,使用谓词反而麻烦,只有在对数组的每个值都进行判断或者类似日期包含这样较复杂的判断时候,就是用谓词,可以尽量简洁。


转载于:https://www.cnblogs.com/walkingZero/p/3920517.html

此压缩包包含了本毕业设计项目的完整内容,具体包括源代码、毕业论文以及演示PPT模板。 开发语言:Java 框架:SSM(Spring、Spring MVC、MyBatis) JDK版本:JDK 1.8 或以上 开发工具:Eclipse 或 IntelliJ IDEA Maven版本:Maven 3.3 或以上 数据库:MySQL 5.7 或以上 项目配置完成后即可运行,若需添加额外功能,可根据需求自行扩展。 运行条件 确保已安装 JDK 1.8 或更高版本,并正确配置 Java 环境变量。 使用 Eclipse 或 IntelliJ IDEA 打开项目,导入 Maven 依赖,确保依赖包下载完成。 配置数据库环境,确保 MySQL 服务正常运行,并导入项目中提供的数据库脚本。 在 IDE 中启动项目,确认所有服务正常运行。 主要功能简述: 请假审批流程:系统支持请假申请的逐级审批,包括班主任审批和院系领导审批(针对超过三天的请假)。学生可以随时查看请假申请的审批进展情况。 请假记录管理:系统记录学生的所有请假记录,包括请假时间、原因、审批状态及审批意见等,供学生和审批人员查询。 学生在线请假:学生可以通过系统在线填写请假申请,包括请假的起止日期和请假原因,并提交给班主任审批。超过三天的请假需经班主任审批后,再由院系领导审批。 出勤信息记录:任课老师可以在线记录学生的上课出勤情况,包括迟到、早退、旷课和请假等状态。 出勤信息查询:学生、任课老师、班主任、院系领导和学校领导均可根据权限查看不同范围的学生上课出勤信息。学生可以查看自己所有学年的出勤信息,任课老师可以查看所教班级的出勤信息,班主任和院系领导可以查看本班或本院系的出勤信息,学校领导可以查看全校的出勤信息。 出勤统计与分析:系统提供出勤统计功能,可以按班级、学期等条件统计学生的出勤情况,帮助管理人员了解学生的出勤状况。 用户管理:系统管理员负责管理所有用户信息,包括学生、任课老师、班主任、院系领导和学校领导的账号创建、权限分配等。 数据维护:管理员可以动态更新和维护系统所需的数据,如学生信息、课程安排、学年安排等,确保系统的正常运行。 系统配置:管理员可以对系统进行配置,如设置数据库连接参数、调整系统参数等,以满足不同的使用需求。 身份验证:系统采用用户名和密码进行身份验证,确保只有授权用户才能访问系统。不同用户类型(学生、任课老师、班主任、院系领导、学校领导、系统管理员)具有不同的操作权限。 权限控制:系统根据用户类型分配不同的操作权限,确保用户只能访问和操作其权限范围内的功能和数据。 数据安全:系统采取多种措施保障数据安全,如数据库加密、访问控制等,防止数据泄露和非法访问。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值