【学习ios之路:UI系列】NSPredicate相关用法

  NSPredicate   

       NSPredicate是一个Foundation类,它指定数据被获取或者过滤的方式。

      它的查询语言就像SQL的WHERE和正则表达式的交叉一样,提供了具有表现力的,自然语言界面来定义一个集合被搜寻的逻辑条件。

      NSPredicate的几种用法

      ①常见形式

   NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'zhangdan'"];
    //注意:如果谓词串中的文本块未被引用,则被看做是键路径,即需要用引号表明是字符串,单引号,双引号均可.
    键路径可以在后台包含许多强大的功能
    ②计算谓词

      让谓词通过某个对象来计算自己的值,给出BOOL值.例如:

     NSPredicate  *predicate = [NSPredicate predicateWithFormat: @"name == 'zhangsan'"];
    BOOL match = [predicate evaluateWithObject: person];
    NSLog (@"%s", (match) ? "YES" : "NO");
    //注上面的person是人对象
      ③燃料过滤器

        filteredArrayUsingPredicate:是NSArray数组的一种类别方法,循环过滤数组中的内容,将值为YES的对象累积到结果数组中返回.

 NSPredicate  *predicate = [NSPredicate predicateWithFormat:@"n"];
 NSArray *results = [arr filteredArrayUsingPredicate: predicate]; NSLog (@"%@", results);


     ④格式说明书

     %d和%@表示插入数值和字符串,%K表示key    还可以引入变量名,用$,类似环境变量,如:@"name == $NAME",再用predicateWithSubstitutionVariables调用来构造新的谓词(键/值字典),其中键是变量名,值是要插入的内容,注意这种情况下不能把变量当成键路径,只能用作值.

  predicate = [NSPredicate predicateWithFormat: @"name == %@", @"zhangsan"];
  predicate = [NSPredicate predicateWithFormat: @"%K == %@", @"name", @"zhangsan"];

  NSPredicate *predicateTemplate =[NSPredicate predicateWithFormat:@"name == $NAME"];
  NSDictionary *dic = [NSDictionary dictionaryWithObjectsAndKeys:
                             @"zhangsan", @"NAME", nil];
  NSPredicate *predicate = [predicateTemplate predicateWithSubstitutionVariables: 
                                                                            dic];
  NSLog(@"%@", predicate);

    ⑤比较和逻辑运算符

    ==等于    >:大于     >=和=>:大于或等于    <:小于    <=和=<:小于或等于    !=和<>:不等于
    括号和逻辑运算AND、OR、NOT或者C样式的等效表达式&&   ||    !
    注意:不等号适用于数字和字符串

    NSArray *arrayFilter = [NSArray arrayWithObjects:@"abc1", @"abc2", nil];
    NSArray *arrayContent = [NSArray arrayWithObjects:@"a1",
                                                   @"abc1", @"abc4", @"abc2", nil];
    NSPredicate *thePredicate = [NSPredicate predicateWithFormat:
                                                 @"NOT (SELF in %@)", arrayFilter];
    [arrayContent filterUsingPredicate:thePredicate];
    ⑥数组字符串
    BETWEEN和IN后加某个数组,可以用{50,200},也可以用%@格式说明符插入自己的对象,也可以用变量.

    predicate = [NSPredicate predicateWithFormat:
                 @"engine.horsepower BETWEEN { 50, 200 }"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
     
    
    predicate = [NSPredicate predicateWithFormat: @"name IN { 'Herbie', 
                                                       'Snugs', 'Badger', 'Flap' }"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", [results valueForKey: @"name"]);
     ⑦.字符串运算符

     BEGINSWITH        ENDSWITH         CONTAINS
     [c]:后缀表示不区分大小写       [d]:不区分发音符号      [cd]:后缀不区分大小写和不区分发音符号,
  例如:   @"name CONTAIN[cd] 'ang'"   //包含某个字符串
             @"name BEGINSWITH[c] 'sh'"     //以某个字符串开头
             @"name ENDSWITH[d] 'ang'"      //以某个字符串结束

    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'Bad'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
    
    predicate = [NSPredicate predicateWithFormat: @"name ENDSWITH 'HERB'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
    
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH[cd] 'HERB'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);

  ⑧.LIKE通配符--模糊查询(元字符 ? * )

  ? 匹配1个字符

  * 匹配多个字符

    LIKE:左边的表达式等于右边的表达式:?和*可作为通配符,其中?匹配1个字符,*匹配0个或者多个字符。
    LIKE也接受[cd]符号

    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);

⑨.MATCHES可以使用正则表达式

? 匹配1个字符

 * 匹配多个字符

 .  匹配任何单个字符

 ^ 匹配一行的首个字符串

 []  匹配括号内任意一个字符 .例如[a-zA-Z]

 +  匹配多个正好在它前面的字符
    NSString *regex1 = @"^A.+e$";   //以A开头,e结尾
    NSString *regex = @"[A-Za-z]+";
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    if ([predicate evaluateWithObject:aString]) {
      
    }
⑩.self就表示对象本身

    NSArray *arrayFilter = [NSArray arrayWithObjects:@"abc1", @"abc2", nil];
    NSArray *arrayContent = [NSArray arrayWithObjects:@"a1", @"abc1", @"abc4", @"abc2", nil];
    NSPredicate *thePredicate = [NSPredicate predicateWithFormat:@"NOT (SELF in %@)", arrayFilter];
    [arrayContent filterUsingPredicate:thePredicate];
①①.合计操作

   ANY,SOME:指定下列表达式中的任意元素。比如,ANY children.age < 18。
    ALL:指定下列表达式中的所有元素。比如,ALL children.age < 18。
    NONE:指定下列表达式中没有的元素。比如,NONE children.age < 18。它在逻辑上等于NOT (ANY ...)。
    IN:等于SQL的IN操作,左边的表达必须出现在右边指定的集合中。比如,name IN { 'Ben', 'Melissa', 'Nick' }。

①②.NSPredicate +predicateWithBlock:(块语法)

   NSPredicate *shortNamePredicate = [NSPredicate predicateWithBlock:
                                ^BOOL(id evaluatedObject, NSDictionary *bindings) {
        return [[evaluatedObject firstName] length] <= 5;
    }];
    // ["Alice Smith", "Bob Jones"]
    NSLog(@"Short Names: %@", [people filteredArrayUsingPredicate:shortNamePredicate]);
①③.NSCompoundPredicate
我们见过与&或被用在谓词格式字符串中以创建复合谓词。然而,我们也可以用NSCompoundPredicate来完成同样的工作。

<span style="font-size:18px;">    //例如,下列谓词是相等的:
    [NSCompoundPredicate andPredicateWithSubpredicates:
                                   @[[NSPredicate predicateWithFormat:@"age > 25"], 
                   [NSPredicate predicateWithFormat:@"firstName = %@", @"Quentin"]]];
    
    [NSPredicate predicateWithFormat:@"(age > 25) AND (firstName = %@)", @"Quentin"];</span>

谓词和正则表达式的综合:(判断手机号码,电话号码函数)

- (BOOL)isMobileNumber:(NSString *)mobileNum
{
    // 正则判断手机号码地址格式
    /**
     * 手机号码
     * 移动:134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     * 联通:130,131,132,152,155,156,185,186
     * 电信:133,1349,153,180,189
     */
    NSString * MOBILE = @"^1(3[0-9]|5[0-35-9]|8[025-9])\\d{8}$";
    /**
     * 中国移动:China Mobile
     * 134[0-8],135,136,137,138,139,150,151,157,158,159,182,187,188
     */
    NSString * CM = @"^1(34[0-8]|(3[5-9]|5[017-9]|8[278])\\d)\\d{7}$";
    /**
     * 中国联通:China Unicom
     * 130,131,132,152,155,156,185,186
     */
    NSString * CU = @"^1(3[0-2]|5[256]|8[56])\\d{8}$";
    /**
     * 中国电信:China Telecom
     * 133,1349,153,180,189
     */
    NSString * CT = @"^1((33|53|8[09])[0-9]|349)\\d{7}$";
    /**
     * 大陆地区固话及小灵通
     * 区号:010,020,021,022,023,024,025,027,028,029
     * 号码:七位或八位
     */
    // 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;
    }
}




.

RHCE 学习之路 系列之<> (1)

04-05

續貼 http://expert.csdn.net/Expert/topic/2859/2859310.xml?temp=.7001764rnrn謝謝大家的鼓勵!rn轉貼一個有關 Linux 基本指令的文章rnrn Linux 文件命令精通指南rn 作者:Sheryl Calish rn 原文出處:http://otn.oracle.com/global/cn/pub/articles/calish_file_commands.htmlrn Copyright (C) Oraclernrn为刚接触 Linux 文件命令的初学者提供的速成教程 rnrn虽然 GUI 桌面(如 KDE 和 GNOME)能够帮助用户利用 Linux 特性,而无需关于命令行接口的功能知识,但还是经常会需要更多的功能和灵活性。而且,基本熟悉这些命令对于在 shell 脚本中正确地使某些功能自动化仍然是必需的。 rnrn这篇文章是关于 Linux 文件命令的一个“速成教程”,它是为那些刚接触这个操作系统或者只是需要补充这方面知识的用户提供的。它包含了对一些更有用的命令的一个简明的概述以及关于它们的最强大的应用的指导。下面包含的信息 — 结合一些实验 — 将使您能够容易地掌握这些基本的命令。(注意:当涉及到一个与 Oracle 集群文件系统 (OCFS) 结合的内核时,这些命令中的某些命令的行为可能会稍微有所不同。在此情况下,Oracle 提供了一个 OCFS 工具集,该工具集可以为文件命令应用提供一个更好的选择。) rnrn注意,这里包含的所有示例都在 SUSE Linux 8.0 Professional 上进行了测试。虽然没有理由相信它们在其它的系统上将不能工作,但如果出现问题,您应当查看您的文档,以了解可能的变化。 rnrn背景概念 rnrn在深入研究规范之前,让我们回顾一些基础知识。 rnrn文件和命令 rnrn在 Linux/UNIX 操作系统中,所有事物都被当作文件来处理:硬件设备(包括键盘和终端)、目录、命令本身,当然还有文件。这个奇怪的惯例实际上是 Linux/UNIX 的能力和灵活性的基础。 rnrn大多数(几乎是全部)的命令形式如下: rnrnrncommand [option] [source file(s)] [target file]rnrnrn获取帮助 rnrn最有用的命令之一是那些提供帮助的命令(特别是对那些学习 Linux 的人而言)。Linux 中的两个重要的信息来源是联机参考手册,或 man 页面和 whatis 工具。您可以用 whatis 命令来访问一个不熟悉的命令的 man 页面。 rnrnrn$ whatis echornrnrn要了解关于这个命令的更多信息,可以使用: rnrnrn$ man echo rnrnrn如果您不知道某个特殊任务所需的命令,您可以用 man -k (也称为 apropos)和一个主题来生成可能的命令。例如: rnrnrn$ man -k filesrnrnrn一个很有用但常常被忽视的命令可以提供关于使用 man 本身的信息: rnrnrn$ man manrnrnrn您可以用 SPACEBAR 来浏览任意的 man 页面;UP ARROW 将向上翻滚文件。.要退出,则输入 q,!,或 CTRL-Z。 rnrn用户类别 rnrn记得那句名言“所有动物一例平等但有些动物比其他动物更加平等”吗?在 Linux 世界中,根用户掌管一切。 rnrn根用户可以以另一个用户名 su (源自 "superuser")登录。要执行诸如添加一个新用户、打印机或文件系统之类的任务,必须作为根用户登录或者用 su 命令和根用户密码切换到超级用户。系统文件(包括控制初始化过程的系统文件)归根用户所有。虽然可能允许普通用户对它们进行读操作,但出于系统安全性的原因,编辑的权利将留给根用户。 rnrnBASH shell rnrn虽然提供了其它的 shell,但 BASH (Bourne Again Shell) 是 Linux 的默认 shell。它结合了与它同名的 Bourne shell 的特性和 Korn、C 和 TCSH shell 的特性。 rnrnBASH 内置的命令 history 默认记录最后输入的 500 条命令。可以通过在命令提示符下输入 history 来查看它们。要检索某个特定的命令,可以在命令提示符下按 UP ARROW 或 DOWN ARROW,或在历史列表中输入它的编号,并在编号前面加上 "!",例如: rnrnrn$ !49rnrnrn您还可以通过一条命令在历史列表中离位置最靠前的项目的距离来执行该命令:如果在历史列表中有 53 个事件,$ !-3 将执行事件号 51。 rnrn像 UNIX/Linux 世界的其它 shell 一样,BASH 使用了特殊的环境变量来方便系统管理。例如: rnrnrnHOME,用户主目录 rnPATH,Linux 用来搜索您输入的命令的可执行镜像的搜索路径 rnHISTSIZE,系统保存的历史事件的数量 rnrn除了这些保留的关键字之外,您还可以定义您自己的环境变量。例如,Oracle 使用 ORACLE_HOME (还有其它一些变量),要使 Oracle 安装成功完成,必须在您的环境中设置这些变量。 rnrn可以在提示符下临时设置变量: rnrnrn$HISTSIZE=100rnrnrn或者,在 /etc/profile (需要根用户权限)中进行系统范围的永久设置,或在 .profile 中进行局部永久设置。 rnrn可以通过 echo 命令,并用一个 $ 符号来访问一个环境变量的值,进而查看该值。 rnrnrn rn$ echo $HOMErn/home/bluherrnrnrn可以用 env 命令来查看当前所有的环境变量。 rnrn正则表达式和通配符 rnrn许多 Linux 命令使用通配符 * 和 ? 来匹配任意数量的字符或分别匹配任意的单个字符;正则模式匹配表达式利用一个句点 (.) 来匹配除“换行符”之外的任意单个字符。这两种情况下都使用方括号 ([ ]) 来匹配除“*”号之外的字符组。不过,* 号在各种情况下有类似但不同的意义:虽然它在 shell 中将匹配一个或更多的字符,但在正则表达式中,它匹配上述字符的零个或更多的实例。一些命令(如 egrep 和 awk)使用了一组更广泛的特殊字符来进行模式匹配。 rnrn文件处理命令 rnrn剖析一个文件列表 rnrnls 命令用来查看用户有执行权限的任意目录中的文件列表,该命令有许多有趣的选项。例如: rnrnrn$ ls -liah *rn22684 -rw-r--r-- 1 bluher users 952 Dec 28 18:43 .profilern19942 -rw-r--r-- 1 scalish users 30 Jan 3 20:00 test2.outrn925 -rwxr-xr-x 1 scalish users 378 Sep 2 2002 test.shrnrnrn上面的列表显示 8 列: rnrnrn第 1 列指示文件的 inode,因为我们使用了 -i 选项。剩下的列通过 -l 选项来进行正常显示。 rn第 2 列显示文件类型和文件访问权限。 rn第3 列显示链接数,包括目录。 rn第 4 和第 5 列显示文件的所有者和组所有者。这里,所有者 "bluher" 属于组 "users"。 rn第 6 列显示文件大小(单位为所显示的单位,而不是默认的字节数,因为我们使用了 -h 选项。 rn第 7 列显示日期(它看起来像是三列),包括月、日和年,以及当天的时间。 rn第 8 列显示文件名。在选项列表中使用 -a 将使列表中包含隐藏文件(如 .profile)的列表。 rn处理文件 rnrn可以移动 (mv)、复制 (cp) 或删除 (rm) 文件和目录。明智地使用 -i 选项,以获得确认通常是个不错的主意。 rnrnrn$ cp -i ls.out ls2.outrncp:overwrite `ls2.out'?rnrnrnmv 命令允许使用 -b 选项,这将在移动文件之前作一个备份拷贝。rm 和 cp 接受功能强大但却危险的 -r 选项,它将在一个目录和它的文件上递归执行。 rnrnrn$ rm -ir Testrnrm:descend into directory `Test'? yrnrnrn可以用 mkdir 来创建目录,用 rmdir 来删除目录。不过,因为不能用 rmdir 来删除包含文件的目录,所以使用 rm 加 -r 选项通常要更方便些。 rnrn出于安全的原因,所有的文件都有所有权和保护。文件访问权限(或文件模式)包含之前提到的相同的 10 个字符: rnrnrn第一个字符指示文件类型。最常见的是 - 代表文件,d 代表目录,而 l 代表链接。 rn接下来的 9 个字符是三种用户类别的访问权限:文件所有者(字符 2-4),用户组 (5-7) 和其它 (8-10),其中 r 表示读权限,w 表示写权限,x 指示一个文件上的执行权限。破折号 - 如果出现在这九个位置的任意一个,则指示这个操作对该类别的用户禁止。 rnrn可以使用 chmod 命令通过字符符号或二进制掩码来设置访问权限。要使用二进制掩码,必须将三个权限组的字符表示转换成二进制格式,然后转换成八进制格式: rnrn用户类别: 所有者 用户组 其它 rn字符表示: rwx r-x r-- rn二进制表示: 111 101 100 rn八进制表示: 7 5 4 rnrnrnrnrnrnrnrnrnrnrnrnrn将写权限赋予用户组,您可以使用: rnrnrnchmod g+w test.sh or chmod 774 test.shrnrnrn用 umask 命令,在 /etc/init.dev 文件中进行系统范围内的、或在 .profile 文件中进行的本地的文件权限默认设置。这个命令指示用 777 减去这个数字来获取默认的权限: rnrnrn$ umask 022rnrnrn这将为用户创建的所有新文件生成一个默认的文件权限 755。 rnrn可以用 chown 来修改文件的所有权: rnrnrn$ chown bluher ls.outrnrnrn这里,bluher 是新的文件所有者。类似地,组成员资格将按以下方式修改: rnrnrn$ chgrp devgrp ls.outrnrnrn这里,devgrp 是新的用户组。 rnrnls 不提供哪些文件是文本的,哪些文件是二进制的的信息。要了解这个信息,您可以使用 file * 命令。 rnrn重命名文件 rnrn赋予一个文件多个名字的两种流行的方法是利用链接和 alias 命令。Alias 可以用来为一个更长的命令重新起一个更方便的名字: rnrnrn$ alias ll='ls -l'rn$ llrnrnrn注意单引号的使用,这使得 BASH 将该项目传递给别名,而不是自己估计它。别名还可用作较长的路径名的缩写: rnrnrn$ alias jdev9i=/jdev9i/jdev/bin/jdevrnrnrn关于 alias 和它的反命令 unalias 的更多信息,请查看 BASH 的 man 页面的 "SHELL BUILTIN COMMANDS" 子部分。在最后一个例子中,定义了一个环境变量来实现相同的结果。 rnrnrn$ export JDEV_HOME=/jdev9i/jdev/bin/jdevrn$ echo $JDEV_HOMErn/jdev9i/jdev/bin/jdevrn$ $JDEV_HOME

objective-C IOS core data 使用NSPredicate查询

03-29

一个表里面有firstname ,lastname两个属性,我想查出firstname或者lastname中包含form的项rn分别查我会,不知道怎么合并rnrnNSString * searchTerm = [searchBar text];rn [NSFetchedResultsController deleteCacheWithName:@"Master"];rn NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];rn // Edit the entity name as appropriate.rn NSEntityDescription *entity = [NSEntityDescription entityForName:@"Contact" inManagedObjectContext:self.managedObjectContext];rn [fetchRequest setEntity:entity];rn rn // Set the batch size to a suitable number.rn [fetchRequest setFetchBatchSize:20];rn [color=#FF0000]NSString *form = [NSString stringWithFormat:@"%@*",searchTerm ];rn NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(firstname like %@)",form];[/color]rn // NSLog(@"%@",searchBar.text);rn [fetchRequest setPredicate:predicate];rn // Edit the sort key as appropriate.rn NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstname" ascending:YES];rn NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];rn rn [fetchRequest setSortDescriptors:sortDescriptors];rn rn // Edit the section name key path and cache name if appropriate.rn // nil for section name key path means "no sections".rn NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:@"Master"];rn aFetchedResultsController.delegate = self;rn self.fetchedResultsController = aFetchedResultsController;rn

没有更多推荐了,返回首页

私密
私密原因:
请选择设置私密原因
  • 广告
  • 抄袭
  • 版权
  • 政治
  • 色情
  • 无意义
  • 其他
其他原因:
120
出错啦
系统繁忙,请稍后再试