【ios开发】关于NSPredicate的详解

来源:互联网 发布:网络摄像头破解原理 编辑:程序博客网 时间:2024/06/13 21:13

NSPredicate是什么?
NSPredicate:谓词,提供了NSPredicate 用于指定过滤条件,谓词是指在计算机中表示计算真假值的函数,它使用起来有点儿像SQL 的查询条件,主要用于从集合中分拣出符合条件的对象,也可以用于字符串的正则匹配。

NSPredicate的具体用途应该还是过滤和筛选,类似于过滤条件之类的,用于筛选一些数组或者用于搜索的作用。(详见我下面的举例)
NSPredicate的定义方法:
我们看到创建谓词使用类方法predicateWithFormat: (NSString*) format,format 里的东西真的
和SQL 的where 条件差不多。
另外,参数format 与NSLog 的格式化模版差不多,如果1 和
188.0 是传递过来的参数,你可以写成如下的形式:
@”pid>%d and height<%f”,1,188.0
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
上面只是介绍了谓词的基本内容,下面看实战的实例内容:

//初始化数据-(void)initDataSource{    for (int i = 0; i < 50; i ++) {        [_dataArray addObject:@{@"name":[NSString stringWithFormat:@"Hello World %d",i],@"age":@"1"}];    }}

使用谓词的搜索,在代理方法内

NSArray *tempResults = nil;    // 谓词搜索    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name contains [cd] %@ OR age contains [cd] %@",searchText,searchText];    tempResults =  [_dataArray filteredArrayUsingPredicate:predicate];    [_resultsData removeAllObjects];    [_resultsData addObjectsFromArray:tempResults];

@”name contains [cd] %@ OR age contains [cd] %@”,searchText,searchText]这个的意思就是:筛选name的key 的value中包含searchText的字典以及age中包含的searchText的数组,(当然是model类型也是可以的)
这个时候大家应该明白了怎么用了吧!
@”name contains [cd] %@”,searchText] :这个意思name的key的value中包含searchText的内容;

筛选两个数组的不一样的objects

NSArray * arr1 = @[@1,@2,@3];

NSArray * arr2 = @[@2,@3,@4,@5];

NSPredicate * filterPredicate = [NSPredicate predicateWithFormat:@”NOT (SELF IN %@)”,arr1];

NSArray * filter = [arr2 filteredArrayUsingPredicate:filterPredicate];
NSLog(@”%@”,filter);

其他的用法:我就不再一一叙述:参考别人的用法给大家放在这里:

predicate = [NSPredicatepredicateWithFormat:@"name LIKE[cd] '*er*'"];//*代表通配符Like还接受[cd].
results = [cars filteredArrayUsingPredicate: predicate];NSLog (@"%@", results);

predicate = [NSPredicatepredicateWithFormat:@”name LIKE[cd] ‘???er*’”];//?只匹配一个字符并且还可以接受[cd].

results = [cars filteredArrayUsingPredicate: predicate];NSLog (@"%@", results);
 NSPredicate *predicate;    predicate=[NSPredicatepredicateWithFormat:@"name=='Herbie'"];//用predicateWithFormat创建一个谓词,name作为键路径   BOOL match=[predicateevaluateWithObject:car];//car作为接收对象,evaluateWithObject返回一个bool值。    NSLog(@"%s",(match)?"YES":"NO");  predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > 150"];    NSArray *cars = [garage cars];    for (Car *car in [garage cars]) {        if ([predicate evaluateWithObject: car]) {            NSLog (@"%@", car.name);        }    }遍历cars判断是否是真,然后输出。  predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > 150"];    NSArray *results;    results = [carsfilteredArrayUsingPredicate: predicate];//它将循环过滤数组内容,根据谓词计算每个对象的值,并将值为YES的对象累计到将被返回的新数组中。    NSLog (@"%@", results);filteredArrayUsingPredicate这个方法可以得到我们所需要的值。加上   NSArray *names;    names=[results valueForKey:@"name"];    NSLog (@"%@", names);就和上面的值一样。    NSMutableArray *carsCopy = [carsmutableCopy];    [carsCopyfilterUsingPredicate: predicate];//filterUsingPredicate和NSMutableArray构成新数组。    NSLog (@"%@", carsCopy);    predicate = [NSPredicatepredicateWithFormat:@"engine.horsepower > %d", 50];    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", results);    NSPredicate *predicateTemplate;    NSDictionary *varDict;    predicateTemplate = [NSPredicatepredicateWithFormat: @"engine.horsepower > $POWER"];//创建一个键/值字典来存储,这里$符号用于变量    varDict = [NSDictionarydictionaryWithObjectsAndKeys:               [NSNumbernumberWithInt: 150],@"POWER", nil];//@后面参数名    predicate = [predicateTemplatepredicateWithSubstitutionVariables: varDict];    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", results);  predicate = [NSPredicatepredicateWithFormat:                @"(engine.horsepower > 50) AND (engine.horsepower < 200)"];//可以运用运算符    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"oop %@", results);    predicate = [NSPredicatepredicateWithFormat:                @"engine.horsepower BETWEEN { 50, 200 }"];//这里可以运用between关键字。和上面效果一样    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", results);    NSArray *betweens = [NSArray arrayWithObjects:                         [NSNumbernumberWithInt: 50], [NSNumbernumberWithInt: 200],nil];    predicate = [NSPredicatepredicateWithFormat: @"engine.horsepower BETWEEN %@", betweens];    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", results);    predicateTemplate = [NSPredicatepredicateWithFormat:@"engine.horsepower BETWEEN $POWERS"];    varDict = [NSDictionarydictionaryWithObjectsAndKeys: betweens, @"POWERS", nil];    predicate = [predicateTemplatepredicateWithSubstitutionVariables: varDict];//用变量    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", results);    predicate = [NSPredicatepredicateWithFormat:@"name < 'Newton'"];//不等号不仅可以用于数字,也可以用于字符串值。    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", [results valueForKey: @"name"]);    predicate = [NSPredicatepredicateWithFormat:@"name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//包含在其中用IN    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", [results valueForKey: @"name"]);    predicate = [NSPredicatepredicateWithFormat:@"SELF.name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//self关键字    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", [results valueForKey: @"name"]);    names = [cars valueForKey: @"name"];    predicate = [NSPredicatepredicateWithFormat:@"SELF IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];//self关键字    results = [namesfilteredArrayUsingPredicate: predicate];    NSLog (@"%@", results);    predicate = [NSPredicatepredicateWithFormat:@"name BEGINSWITH 'Bad'"];//字符串运算符BEGINSWITH,ENDSWITH,CONTAINS[c][d][cd]    results = [cars filteredArrayUsingPredicate: predicate];    NSLog (@"%@", results);    BEGINSWITH:检查某个字符串是否以另一个字符串开头。    ENDSWITH:检查某个字符串是否以另一个字符串结尾。    CONTAINS:检查某个字符串是否以另一个字符串内部。    [c]不区分大小写[d]不区分发音符号即没有重音符号[cd]既不区分大小写,又不区分发音符号。
0 0