编程的人员不管是上过大学还是从培训机构出来的或做后台的、前端的都应该SQL语句有所了解,我们知道,在SQL语句当中 where 条件表达式可以对二维关系表的数据做条件筛选.微软的C# .net中也实现了功能能和SQL语句相媲美的技术,它就是List泛型集合的Lambda表达式,支持查找、排序、比较、组合等.在java中虽然没有在语言中集成对List对象的操作的实现,但是第三方开源库同样实现了这一功能.在IOS开发Cocoa框架中提供了一个功能强大的类NSPRedicate,下面来讨论一下它的强大之处在哪...
NSPredicate继承自NSObject,它有两个派生的子类
• NSComparisonPredicate
• NSCompoundPredicate (子类不是我们今天讨论的对象,暂且了解一下就行)
说到谓词,我们先来看一下谓词的语法。
1.比较运算符
* >:大于
* <:小于
* >=:大于等于
* <=:小于等于
* =,==:等于
* !=,<>:不等于
2.逻辑运算符
*and /&&和
*or/||或
*not/!非
3.关系运算符
*ANY任意,SOME 一些
*ALL所有元素
*NONE没有元素 等同于not any
*in包含
4.范围运算符
* between 如,1 BETWEEN { 0 , 33 },或者$INPUT BETWEEN { $LOWER, $UPPER }。
* in包含
4.字符串本身
*SELF 如:@“self==‘APPLEIOS’”
5.字符串相关
*contain
*between
*endswith
6.like通配符
* like 如:@"name like[cd] '*ios*'"
@"name" like[cd] 'ios*'"
7.正则表达式matches
*如:NSString *regex = @"^A.+e$"; //以A开头,e结尾
@"name MATCHES %@",regex
8.数组操作
* array[index]:指定数组中特定索引处的元素。
*array[first]:制定第一个元素
*array[last]:制定最后一个元素
*array[size]:制定数组大小
下面我们再来看一下具体的事例:
新建一个项目,然后添加类products
Products.h
1 // 2 // Products.h 3 // NSPredicateTest 4 // 5 // Created by xuhongjiang on 15/10/27. 6 // Copyright (c) 2015年 xuhongjiang. All rights reserved. 7 // 8 9 #import <Foundation/Foundation.h>10 11 @interface Products : NSObject12 @property NSString *productName;13 @property NSInteger productCount;14 @property NSString *productImageUrl;15 +(id)initProductWithName:(NSString *) name withCount:(NSInteger) count withImage:(NSString *) imageurl;16 @end
Products.m
1 // 2 // Products.m 3 // NSPredicateTest 4 // 5 // Created by xuhongjiang on 15/10/27. 6 // Copyright (c) 2015年 xuhongjiang. All rights reserved. 7 // 8 9 #import "Products.h"10 11 @implementation Products12 +(id)initProductWithName:(NSString *)name withCount:(NSInteger)count withImage:(NSString *)imageurl13 {14 Products *sprducts=[[Products alloc] init];15 sprducts.productName=name;16 sprducts.productCount=count;17 sprducts.productImageUrl=imageurl;18 return sprducts;19 }20 -(NSString *)description21 {22 NSString *str=[NSString stringWithFormat:@"产品名称:%@,数量:%ld,图片:%@",_productName,_productCount,_productImageUrl];23 return str;24 }25 @end
测试方法:
1 // 2 // ViewController.m 3 // NSPredicateTest 4 // 5 // Created by xuhongjiang on 15/10/27. 6 // Copyright (c) 2015年 xuhongjiang. All rights reserved. 7 // 8 9 #import "ViewController.h" 10 #import "Products.h" 11 12 @interface ViewController () 13 14 @end 15 16 @implementation ViewController 17 18 - (void)viewDidLoad { 19 [super viewDidLoad]; 20 [self mainTest]; 21 } 22 23 - (void)didReceiveMemoryWarning { 24 [super didReceiveMemoryWarning]; 25 } 26 27 -(void) mainTest 28 { 29 Products *p1=[Products initProductWithName:@"A苹果sdasf" withCount:2 withImage:@"464.jpg"]; 30 Products *p2=[Products initProductWithName:@"fsdf橘子gag" withCount:53 withImage:@"fsdfas.jpg"]; 31 Products *p3=[Products initProductWithName:@"dfgdf香蕉" withCount:5 withImage:@"sfas.jpg"]; 32 Products *p4=[Products initProductWithName:@"三星" withCount:76 withImage:@"ggas.jpg"]; 33 Products *p5=[Products initProductWithName:@"华为dfsd" withCount:9 withImage:@"gasa.jpg"]; 34 Products *p6=[Products initProductWithName:@"微软dhnnne" withCount:6 withImage:@"hshhh.jpg"]; 35 Products *p7=[Products initProductWithName:@"三星" withCount:6 withImage:@"hshhh.jpg"]; 36 Products *p8=[Products initProductWithName:@"15300250500" withCount:6 withImage:@"hshhh.jpg"]; 37 38 NSArray *sproducts=[NSArray arrayWithObjects:p1,p2,p3,p4,p5,p6,p7,nil]; 39 40 //数量小于9 定义谓词 包含过滤条件 41 NSPredicate *prdicate=[NSPredicate predicateWithFormat:@"productCount<%d",9]; 42 //过滤结果返回新的数组 43 NSArray *newArray=[sproducts filteredArrayUsingPredicate:prdicate]; 44 for (Products *item in newArray) { 45 NSLog(@"newArray=%@",item.productName); 46 } 47 48 49 //数量大于9 并且productname等于“三星jfggg” 定义谓词 包含过滤条件 50 prdicate=[NSPredicate predicateWithFormat:@"productName='三星' && productCount>9"]; 51 //过滤结果返回新的数组 52 newArray=[sproducts filteredArrayUsingPredicate:prdicate]; 53 for (Products *item in newArray) { 54 NSLog(@"newArray=%@",item.productName); 55 } 56 57 //in(包含) *注意 包含是全字匹配 58 prdicate = [NSPredicate predicateWithFormat:@"productName IN {'g','华为','三星'}||productCount IN {2,5}"]; 59 //过滤结果返回新的数组 60 newArray=[sproducts filteredArrayUsingPredicate:prdicate]; 61 for (Products *item in newArray) { 62 NSLog(@"newArray=%@",item.productName); 63 } 64 65 66 //productName以a开头的 67 prdicate = [NSPredicate predicateWithFormat:@"productName BEGINSWITH 'A'"]; 68 //productName以ba结尾的 69 prdicate = [NSPredicate predicateWithFormat:@"productName ENDSWITH 'g'"]; 70 71 //name中包含字符a的 72 prdicate = [NSPredicate predicateWithFormat:@"productName CONTAINS 'a'"]; 73 74 //like 匹配任意多个字符 75 //productName中只要有s字符就满足条件 76 prdicate = [NSPredicate predicateWithFormat:@"productName like '*s*'"]; 77 //?代表一个字符,下面的查询条件是:name中第二个字符是s的 78 prdicate = [NSPredicate predicateWithFormat:@"productName like '?s*'"]; 79 80 newArray=[sproducts filteredArrayUsingPredicate:prdicate]; 81 for (Products *item in newArray) { 82 NSLog(@"newArray=%@",item.productName); 83 } 84 85 //正则表达式 验证是否是手机号 86 BOOL isMobileNum=[self isMobileNumber:p8.productName]; 87 if(isMobileNum) 88 NSLog(@"是真确的手机号:%@",p8.productName); 89 90 } 91 92 93 - (BOOL)isMobileNumber:(NSString *)mobileNum 94 { 95 /** 96 * 手机号码 97 * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188 98 * 联通:130,131,132,152,155,156,185,186 99 * 电信:133,1349,153,180,189100 */101 NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])//d{8}$";102 /**103 10 * 中国移动:China Mobile104 11 * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188105 12 */106 NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])//d)//d{7}$";107 /**108 15 * 中国联通:China Unicom109 16 * 130,131,132,152,155,156,185,186110 17 */111 NSString * CU = @"^1(3[0-2]|5[256]|8[56])//d{8}$";112 /**113 20 * 中国电信:China Telecom114 21 * 133,1349,153,180,189115 22 */116 NSString * CT = @"^1((33|53|8[09])[0-9]|349)//d{7}$";117 /**118 25 * 大陆地区固话及小灵通119 26 * 区号:010,020,021,022,023,024,025,027,028,029120 27 * 号码:七位或八位121 28 */122 // NSString * PHS = @"^0(10|2[0-5789]|//d{3})//d{7,8}$";123 124 NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];125 NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];126 NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];127 NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];128 129 if (([regextestmobile evaluateWithObject:mobileNum] == YES)130 || ([regextestcm evaluateWithObject:mobileNum] == YES)131 || ([regextestct evaluateWithObject:mobileNum] == YES)132 || ([regextestcu evaluateWithObject:mobileNum] == YES))133 {134 if([regextestcm evaluateWithObject:mobileNum] == YES) {135 NSLog(@"中国移动");136 } else if([regextestct evaluateWithObject:mobileNum] == YES) {137 NSLog(@"联通");138 } else if ([regextestcu evaluateWithObject:mobileNum] == YES) {139 NSLog(@"电信");140 } else {141 NSLog(@"Unknow");142 }143 144 return YES;145 }146 else147 {148 return NO;149 }150 }151 @end
1.查询产品数量小于9的产品
这里的代码很简单,第一步创建一个过滤器,用占位符替换数量9,过滤器返回一个新的数组,之后遍历数组,只取产品名称。
//数量小于9 定义谓词 包含过滤条件 NSPredicate *prdicate=[NSPredicate predicateWithFormat:@"productCount<%d",9]; //过滤结果返回新的数组 NSArray *newArray=[sproducts filteredArrayUsingPredicate:prdicate]; for (Products *item in newArray) { NSLog(@"newArray=%@",item.productName); }
2.查询数量大于9 并且productname等于“三星jfggg”的产品
//数量大于9 并且productname等于“三星jfggg” 定义谓词 包含过滤条件 prdicate=[NSPredicate predicateWithFormat:@"productName='三星' && productCount>9"]; //过滤结果返回新的数组 newArray=[sproducts filteredArrayUsingPredicate:prdicate];
3.in包含 (*注 包含是全字匹配)
prdicate = [NSPredicate predicateWithFormat:@"productName IN {'g','华为','三星'}||productCount IN {2,5}"]; //过滤结果返回新的数组 newArray=[sproducts filteredArrayUsingPredicate:prdicate];
4.字符串相关处理
//productName以a开头的 prdicate = [NSPredicate predicateWithFormat:@"productName BEGINSWITH 'A'"]; //productName以ba结尾的 prdicate = [NSPredicate predicateWithFormat:@"productName ENDSWITH 'g'"]; //name中包含字符a的 prdicate = [NSPredicate predicateWithFormat:@"productName CONTAINS 'a'"];
5.like通配符,用于模糊查询
//like 匹配任意多个字符 //productName中只要有s字符就满足条件 prdicate = [NSPredicate predicateWithFormat:@"productName like '*s*'"]; //?代表一个字符,下面的查询条件是:name中第二个字符是s的 prdicate = [NSPredicate predicateWithFormat:@"productName like '?s*'"]; newArray=[sproducts filteredArrayUsingPredicate:prdicate];
6.正则表达式,例子是验证是否是手机号
//正则表达式串 NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])//d{8}$";//创建含有正则表达式的帅选器 NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];//筛选器的evaluateWithObject方法反向验证是否手机号,返回bool值BOOL isPhoneNum=[regextestmobile evaluateWithObject:@"15300250500"] ;
关于谓词的使用,我们只列举了几个常见的用法,它还有很多种灵活的用法,如对时间datetime的间隔筛选、谓词变量 ”谓词==$变量名“等,待有时间希望大家去研究。
新闻热点
疑难解答