• NSPredicate:谓词

    • 字面翻译是这个意思,但是我觉得谓词这个词太难以理解了
    • NSPredicate的具体用途应该还是过滤,类似于过滤条件之类的,相当于一个主语的谓语,所以说会是谓词这个名字。(我是这么理解的)

1、NSPredicate的创建

  • 我们看到创建谓词使用类方法predicateWithFormat: (NSString*) format,format 里的东西真的和 SQL 的 where 条件差不多。
  • 另外,参数format 与NSLog 的格式化模版差不多,如果1 和 188.0 是传递过来的参数,你可以写成如下的形式:
	@"pid>%d and height<%f",1,188.0

2、NSPredicate中主要的几种运算方式

  • 2.1比较运算符 > 、< 、== 、 >= 、<= 、 !=

    例:@"number >= 99"
  • 2.2 逻辑运算符:AND、OR、NOT 这几个运算符计算并、或、非的结果。

  • 2.3 范围运算符:IN 、BETWEEN

    例:@"number BETWEEN {1,5}"
    @"address IN {'shanghai','nanjing'}"
  • 2.4 字符串本身:SELF

    例:@"SELF == 'APPLE'"
  • 2.5字符串相关:BEGINSWITH、ENDSWITH、CONTAINS

    例: @"name CONTAIN[cd] 'ang'" //包含某个字符串
    @"name BEGINSWITH[c] 'sh'" //以某个字符串开头
    @"name ENDSWITH[d] 'ang'" //以某个字符串结束
  • 注:[c]不区分大小写 , [d]不区分发音符号即没有重音符号 , [cd]既不区分大小写,也不区分发音符号。

  • 2.6 通配符:LIKE

    例:@"name LIKE[cd] '*er*'" //*代表通配符,Like也接受[cd].
    @"name LIKE[cd] '???er*'"
  • 2.7 正则表达式:MATCHES

    例:NSString *regex = @"^A.+e$"; //以A开头,e结尾
    @"name MATCHES %@",regex

3、具体使用方法

  • 如何使用NSPredicate对一个自定义实体进行筛选

  • NSPredicate我暂时都是用于过滤的,否则我们过滤就需要自己写判断 写循环,去判断输出了。

  • 接下来就上代码和例子吧。

  • 3.1 建立一个实体类 Dog

    @property (copy   , nonatomic) NSString* name;
    @property (assign , nonatomic) int age ;
    • 这样我们就有一个类了
    • 我们创建 5只Dog的实体
    Dog * dog1=[Dog news];dog1.name=@"这是第一只Dog";dog1.age=@"11";
    Dog * dog2=[Dog news];dog2.name=@"这是第二只Dog";dog2.age=@"22";
    Dog * dog3=[Dog news];dog3.name=@"这是第三只Dog";dog3.age=@"33";
    Dog * dog4=[Dog news];dog4.name=@"这是第四只Dog";dog4.age=@"44";
    Dog * dog5=[Dog news];dog5.name=@"这是第五只Dog";dog5.age=@"55";
    • 不要吐槽我的Dogs的年龄 → 。→
    • 然后我们需要一个Array把他们都装进去
    NSArray * dogArr=@[dog1,dog2,dog3,dog4,dog5];
    • 酱紫所有的Dog都装到一个数组里了
  • 3.2 使用NSPredicate的筛选

    • 没有使用NSPredicate的筛选应该大家都会写,循环+判断。。。
    • 使用NSPredicate的筛选
    • 具体使用的代码
    //创建谓词的对象 谓词条件是基于KVC的,所以需要说明一点,加入Dog里面有个属性是Doginfo指向Doginfo类,在使用的时候 我们的条件就要写成Doginfo.xxx了。
    NSPredicate* predicate = [NSPredicate predicateWithFormat:@"name=='这是第一只Dog' AND age ==11"];
    for(Dog * d in dogArr)
    {
    if([predicate evaluateWithObject:d])
    {
    NSLog(d.name);
    }
    }
    • 以上的代码打印出来的结果就是 这是第一只Dog

    • NSPredicate筛选一个对象逻辑还是很清晰的,不过这里比较麻烦的就是 还有一个循环,这里我们会发现数组提供了一个方法可以更方便的检索数组对象

      直接筛选出一个符合谓词的新数组。

    NSPredicate *pre = [NSPredicate predicateWithFormat:@"age >11"];
    NSMutableArray *arrayPre=[dogArr filteredArrayUsingPredicate: pre];
    • arrayPre里面的对象就会是 除了dog1之外的所有的dog。(至于为什么看我的条件...)

    • 看到这里发现NSPredicate 可以用于自定义的实体的检索、筛选,那如果用于 NSString,NSInteger,bool呢?那我们再看一段代码吧

    NSArray *arrays=[NSArray arrayWithObjects: @"Apple", @"Google", @"MircoSoft", nil];
    NSPredicate *pre2 = [NSPredicate predicateWithFormat:@"SELF=='Apple'"];
  • 3.3 使用NSPredicate在两个数组之间进行差异筛选

    • 上面这段代码是匹配字符串的时候 NSPredicate 需要如何声明
    NSArray* array = @[@"aa",@"bb"];
    NSArray* array2 = @[@"aa",@"bb",@"cc",@"dd"];
    NSPredicate* thePredicate = [NSPredicate predicateWithFormat:@"NOT(SELF in %@)",array];
    NSArray* arr3 = [array2 filteredArrayUsingPredicate:thePredicate];
    NSLog(@"%@",arr3);
    • 上面的代码输出结果 arr3={@"cc" ,@"dd"}
    • 这样大家就很容易理解了
    • SELF在前面有介绍过 可以往回翻阅一下
  • 3.4 如何使用正则筛选一个数组

    NSString *regex = @"^A.+e$";//以A 开头,以e 结尾的字符。
    NSPredicate *pre= [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    if([pre evaluateWithObject: @"Apple"]){
    printf("YES\n");
    } else {
    printf("NO\n");
    }

4、注意事项

  • 关于NSPredicate的其他说明和注意事项,以及技巧
  • 动态属性名
  • 假如你的代码如下
NSPredicate *p = [NSPredicate predicateWithFormat:@"name = %@", @"name1"];
  • 显然代码没有任何问题,但是这个不是最好的写法我建议如下写法:
NSPredicate *preTemplate = [NSPredicate predicateWithFormat:@"name==$NAME"];
NSDictionary *dic=[NSDictionary dictionaryWithObjectsAndKeys:
@"name1", @"NAME",nil];
NSPredicate *pre=[preTemplate predicateWithSubstitutionVariables: dic];
  • 这样看上去可能会让代码逻辑更清晰。

  • 当过滤条件字段都是动态的时候

NSString *key = @"name";
NSString *value = @"name1";
NSPredicate *p = [NSPredicate predicateWithFormat:@"%@ = %@", key, value];
  • 然后当你执行到第三行的时候代码就会报错!
  • 逻辑上没错误啊!!!为什么会出错呢?
  • NSPredicate要自动添加引号,所以最后得到的格式应该是@"'name' = 'name1'"。明显不对。要做的就是:
NSPredicate *p = [NSPredicate predicateWithFormat:@"%K = %@", key, value];

数组谓词查询法 NSPredicate的更多相关文章

  1. TQ210裸机编程(3)——按键(查询法)

    首先查看TQ210的底板原理图 这次编程只操作KEY1和KEY2,在TQ210核心板原理图中搜索XEINT0 可以看出KEY1和KEY2分别接在S5PV210的GPH0_0和GPH0_1引脚. 这次编 ...

  2. paip.sql索引优化----join 代替子查询法

    paip.sql索引优化----join 代替子查询法 作者Attilax ,  EMAIL:1466519819@qq.com 来源:attilax的专栏 地址:http://blog.csdn.n ...

  3. java~springboot~ibatis数组in查询的实现

    在ibatis的xml文件里,我们去写sql语句,对应mapper类的方法,这些sql语句与控制台上没什么两样,但在有些功能上需要注意,如where in这种从数组里查询符合条件的集合里,需要在xml ...

  4. ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点

    LinkedList接口(在代码的使用过程中和ArrayList没有什么区别) ArrayList底层是object数组,所以ArrayList具有数组的查询速度快的优点以及增删速度慢的缺点. 而在L ...

  5. 【树状数组+离线查询】HDU 3333 Turing Tree

    https://www.bnuoj.com/v3/contest_show.php?cid=9149#problem/H [题意] 给定一个数组,查询任意区间内不同数字之和. (n<=30000 ...

  6. php提供一维数组模糊查询

    2019年9月30日14:36:15 提供一维数组模糊查询,只支持utf-8 内部处理是Unicode 编码特殊编码格式的可能会出错 if (!function_exists('arrayFuzzyQ ...

  7. C程序数组算法 — 冒泡法排序【前冒 || 后冒】

    第一种写法(前冒泡): /* C程序数组算法 - 冒泡法排序 * 此例子按照 大 -> 小 排序 * 原理:两两相比较,然后进行大小对调 * 比较次数: n^2 次 * 说明:冒泡排序是相对稳定 ...

  8. NSPredicate谓词查询

    Cocoa提供了一个类NSPredicate类,该类主要用于指定过滤器的条件,该对象可以准确的描述所需条件,对每个对象通过谓词进行筛选,判断是否与条件相匹配.谓词表示计算真值或假值的函数. NSPre ...

  9. JavaScript 语句 数组与冒泡排序法

    数组 数组:不管是什么类型,都可以进行存放.存放是有一定顺序的. 顺序:索引号从0开始. 1.需要先对数组进行初始化 var array //数组名称 = new Arrary() //Array 注 ...

随机推荐

  1. h5的video标签支持的视频格式

    关于<video>标签所支持的视频格式和编码: MP4 = MPEG 4文件使用 H264 视频编解码器和AAC音频编解码器 WebM = WebM 文件使用 VP8 视频编解码器和 Vo ...

  2. POJ2236(并查集入门)

    Wireless Network Time Limit: 10000MS   Memory Limit: 65536K Total Submissions: 22977   Accepted: 961 ...

  3. maven打包指定main函数的入口,生成依赖的包

    为了使Jar包中指定Main方法位置和生成依赖包,需要在pom文件中加入如下配置: <build> <plugins> <plugin> <groupId&g ...

  4. get方法传递中文数据的时候如何进行转码

    首先,如果是在js端的代码,用window.href进行请求时,需要进行转码 前台jsp中: var param = document.getElementById('param').value;pa ...

  5. SA读书笔记1

    SA的基本任务: 帐户: 为新用户增设帐号,将不再活动的帐号删除,帐号存活期事务(忘记密码等).把用户的主目录放在什么位置.在哪些机器上创建帐号. 硬件:识别并使用新硬件.对于虚拟化:设备可能要安装在 ...

  6. mysql添加用户

    增加新用户: 格式:grant select on 数据库.* to 用户名@登录主机 identified by "密码" 例1.增加一个用户test1密码为abc,让他可以在任 ...

  7. [vijos1246]文科生的悲哀(二) 动态规划

    背景 化学不及格的Matrix67无奈选择了文科.他必须硬着头皮艰难地进行着文科的学习. 描述 这学期的政治.历史和地理课本各有n章.每一科的教学必须按章节从前往后依次进行.若干章政治.若干章历史和若 ...

  8. redis学习二 排序

    文章转载自:http://www.cnblogs.com/redcreen/archive/2011/02/15/1955226.html redis支持对list,set和sorted set元素的 ...

  9. 问题:C#控制台;结果:C#限制程序只能运行一個实例 (防多开)

    C# Console类的具体用法 作者: 字体:[增加 减小] 类型:转载 时间:2013-03-08 这篇文章主要介绍C# Console类的具体用法,需要的朋友可以参考下   Console.Wr ...

  10. 部署和调优 2.9 mysql主从配置-3

    测试 先给主mysql解锁 > unlock tables; 删除一个表 > use db1; > show tables; > drop table help_categor ...