首页 > 代码库 > Cocoa过滤器NSPredicate入门使用

Cocoa过滤器NSPredicate入门使用

第一次使用NSPredicate类,这个类主要做数据过滤。比如数组根据条件过滤对象,过滤对象是否包含对象,支持正则表达式。作用等同于sql条件查询,由于是系统类,效率更高一些。

//===================================================

例子1:数组根据对象属性过滤对象

@interface Person : NSObject

@property (nonatomic, copy) NSString *name;

@property (nonatomic, retain) NSNumber *age;

定义一个Person类,拥有name和age属性

   NSMutableArray *array = [NSMutableArray array];
        
        for (int i = 0; i<10; i++) {
            Person *person = [[Person alloc]init];
            [person setAge:[NSNumber numberWithInteger:i]];
            if (i<5) {
                [person setName:[NSString stringWithFormat:@"Jack-%d",i]];
            }else{
                [person setName:[NSString stringWithFormat:@"Tom-%d",i]];
            }
            [array addObject:person];
        }
        
        
        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"age>5"];
        
        for (Person *person in array) {
            if ([predicate evaluateWithObject:person]) {
                NSLog(@"满足条件,我是:%@",person);
            }
        }
创建10个Person对象,存入array数组中

然后,创建一个predicate对象,过滤条件是age属性>5的Person对象

用for in 遍历数组,调用方式如下,evaluateWithObject是比较对象是否满足条件,满足即可打印。


如果不实用for in遍历,还可以用数组的过滤获得满足条件的新数组。

NSArray *arr = [array filteredArrayUsingPredicate:predicate];

用如上一句代替最后的for in遍历获得新数组arr,里面存的就是满足条件age>5的Person对象。

//=======================================================================


Cocoa用NSPredicate描述查询的方式,原理类似于在数据库中进行查询  
计算谓词:  
//基本的查询  
NSPredicate *predicate;  
predicate = [NSPredicate predicateWithFormat: @"name == 'Herbie'"];  
    BOOL match = [predicate evaluateWithObject: car];  
    NSLog (@"%s", (match) ? "YES" : "NO");  
  
//在整个cars里面循环比较  
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"];  
    NSArray *cars = [garage cars];  
    for (Car *car in [garage cars]) {  
        if ([predicate evaluateWithObject: car]) {  
            NSLog (@"%@", car.name);  
        }  
    }  
  
//输出完整的信息  
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"];  
    NSArray *results;  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
  
//含有变量的谓词  
    NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"name == $NAME"];  
    NSDictionary *varDict;  
    varDict = [NSDictionary dictionaryWithObjectsAndKeys:  
               @"Herbie", @"NAME", nil];  
    predicate = [predicateTemplate predicateWithSubstitutionVariables: varDict];  
    NSLog(@"SNORGLE: %@", predicate);  
    match = [predicate evaluateWithObject: car];  
  NSLog (@"%s", (match) ? "YES" : "NO");  
//注意不能使用$VARIABLE作为路径名,因为它值代表值  
  
//谓词字符窜还支持c语言中一些常用的运算符    
    predicate = [NSPredicate predicateWithFormat:  
                 @"(engine.horsepower > 50) AND (engine.horsepower < 200)"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"oop %@", results);  
     
    predicate = [NSPredicate predicateWithFormat: @"name < 'Newton'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", [results valueForKey: @"name"]);  
  
//强大的数组运算符  
    predicate = [NSPredicate predicateWithFormat:  
                 @"engine.horsepower BETWEEN { 50, 200 }"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
     
    NSArray *betweens = [NSArray arrayWithObjects:  
                         [NSNumber numberWithInt: 50], [NSNumber numberWithInt: 200], nil];  
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower BETWEEN %@", betweens];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
    predicateTemplate = [NSPredicate predicateWithFormat: @"engine.horsepower BETWEEN $POWERS"];  
    varDict = [NSDictionary dictionaryWithObjectsAndKeys: betweens, @"POWERS", nil];  
    predicate = [predicateTemplate predicateWithSubstitutionVariables: varDict];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
  
//IN运算符  
    predicate = [NSPredicate predicateWithFormat: @"name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", [results valueForKey: @"name"]);  
    predicate = [NSPredicate predicateWithFormat: @"SELF.name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", [results valueForKey: @"name"]);  
     
    names = [cars valueForKey: @"name"];  
    predicate = [NSPredicate predicateWithFormat: @"SELF IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];  
    results = [names filteredArrayUsingPredicate: predicate];//这里限制了SELF的范围  
    NSLog (@"%@", results);  
//BEGINSWITH,ENDSWITH,CONTAINS  
  
//附加符号,[c],[d],[cd],c表示不区分大小写,d表示不区分发音字符,cd表示什么都不区分  
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'Bad'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
     
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'HERB'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
     
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH[cd] 'HERB'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
  
//LIKE运算符(通配符)  
    predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '*er*'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results);  
     
    predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '???er*'"];  
    results = [cars filteredArrayUsingPredicate: predicate];  
    NSLog (@"%@", results); 


Cocoa过滤器NSPredicate入门使用