天天看点

iOS 学习之 NSPredicate 模糊、精确、查询

简述:Cocoa框架中的NSPredicate用于查询,原理和用法都类似于SQL中的where,作用相当于数据库的过滤取。

定义(最常用到的方法):

[cpp]  view plain copy

  1. NSPredicate *ca = [NSPredicate predicateWithFormat:(NSString *), ...];  

Format:

(1)比较运算符>,<,==,>=,<=,!=

可用于数值及字符串

例:@"number > 100"

(2)范围运算符:IN、BETWEEN

例:@"number BETWEEN {1,5}"

      @"address IN {'shanghai','beijing'}"

(3)字符串本身:SELF 

例:@“SELF == ‘APPLE’"

(4)字符串相关:BEGINSWITH、ENDSWITH、CONTAINS

例:@"name CONTAIN[cd] 'ang'"   //包含某个字符串

       @"name BEGINSWITH[c] 'sh'"     //以某个字符串开头

       @"name ENDSWITH[d] 'ang'"      //以某个字符串结束

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

(5)通配符:LIKE

例:@"name LIKE[cd] '*er*'"    /  

  •        NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";  
  •        NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";  
  •        NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";  
  •        NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";  
  •       // NSString * PHS = @"^0(10|2[0-5789]|\\d{3})\\d{7,8}$";  
  •      NSPredicate *regextestmobile = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", MOBILE];  
  •      NSPredicate *regextestcm = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CM];  
  •      NSPredicate *regextestcu = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CU];  
  •      NSPredicate *regextestct = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", CT];  
  •     if (([regextestmobile evaluateWithObject:mobileNum] == YES)  
  •     || ([regextestcm evaluateWithObject:mobileNum] == YES)  
  •     || ([regextestct evaluateWithObject:mobileNum] == YES)  
  •     || ([regextestcu evaluateWithObject:mobileNum] == YES))  
  •     {  
  •         if([regextestcm evaluateWithObject:mobileNum] == YES) {  
  •           NSLog(@"China Mobile");  
  •         } else if([regextestct evaluateWithObject:mobileNum] == YES) {  
  •           NSLog(@"China Telecom");  
  •         } else if ([regextestcu evaluateWithObject:mobileNum] == YES) {  
  •           NSLog(@"China Unicom");  
  •         } else {  
  •           NSLog(@"Unknow");  
  •         }  
  •         return YES;  
  •     }  
  •     else   
  •     {  
  •         return NO;  
  •     }  
  • }  
  • (6)邮箱验证、电话号码验证:

    [cpp]  view plain copy

    1. //是否是有效的正则表达式  
    2. +(BOOL)isValidateRegularExpression:(NSString *)strDestination byExpression:(NSString *)strExpression  
    3. {  
    4.    NSPredicate *predicate = [NSPredicatepredicateWithFormat:@"SELF MATCHES %@", strExpression];    
    5.    return [predicate evaluateWithObject:strDestination];  
    6. }  
    7. //验证email  
    8. +(BOOL)isValidateEmail:(NSString *)email {  
    9.    NSString *strRegex = @"[A-Z0-9a-z._%+-][email protected][A-Za-z0-9.-]+\\.[A-Za-z]{1,5}";  
    10.    BOOL rt = [CommonTools isValidateRegularExpression:email byExpression:strRegex];  
    11.    return rt;  
    12. }  
    13. //验证电话号码  
    14. +(BOOL)isValidateTelNumber:(NSString *)number {  
    15.    NSString *strRegex = @"[0-9]{1,20}";  
    16.    BOOL rt = [CommonTools isValidateRegularExpression:number byExpression:strRegex];  
    17.    return rt;  
    18. }  

    (7)NSDate进行筛选

    [cpp]  view plain copy

    1. //日期在十天之内:  
    2. NSDate *endDate = [[NSDate date] retain];  
    3. NSTimeInterval timeInterval= [endDate timeIntervalSinceReferenceDate];  
    4. timeInterval -=3600*24*10;  
    5. NSDate *beginDate = [[NSDate dateWithTimeIntervalSinceReferenceDate:timeInterval] retain];  
    6. //对coredata进行筛选(假设有fetchRequest)  
    7. NSPredicate *predicate_date =  
    8. [NSPredicate predicateWithFormat:@"date >= %@ AND date <= %@", beginDate,endDate];  
    9. [fetchRequest setPredicate:predicate_date];  
    10. //释放retained的对象  
    11. [endDate release];  
    12. [beginDate release];