NSPredicate的一些简单用法

NSPredicate可以支持数据库查询,平时的一些数组查询之类也用这个方法,以下是一些总结

格式字符串的一些基本写法

1> @"attributeName == %@" 就是属性名字等于某个值
2>@"%K == %@",将属性名字变为%K,增加拓展性.

// 1.第一种写法,右边值如果是字符串,可以用单引号表示
NSPredicate *pre = [NSPredicate predicateWithFormat:@"nickName == '小明'",];
// 2.第二种写法,%K的K必须大写,不能用%@代替
NSString *name = @"cat.nickName";
NSPredicate *pre = [NSPredicate predicateWithFormat:@"%K == %@",name,@"小明"];

左右两边基本的比较操作符号

1.=,==左边表达式等于右手表达式

2.>=,=>左边表达式大于或等于右边表达式

3.<=,=<左变表达式小于或等于右边表达式

4> 或者 <

5.!=,<>左边表达式不等于右边表达式

6.IN左边表达式必须出现在右边表达式指定的集合中。即name IN {'Milk','Eggs','Bread'}

7.BETWEEN左边表达式在右边表达式之间或等于右边表达式。即1 {0,33}之间。如果你的左边表达式是0或33,也是真的

8.以下是字符串表达式的比较符号
(1)BEGINSWITH左边表达式以右边表达式开始
(2)CONTAINS左边表达式包含表达式
(3)ENDSWITH左边表达式以右边表达式结束
(4)LIKE左边表达式等于右手表达式:*作为通配符,其中匹配1个字符,*匹配0个或多个字符
(5)MATCHES左边表达式等于右边表达式使用正则表达式样式比较

两个表达式的逻辑符号

1.AND,&&,逻辑AND

2.OR,||逻辑或

3.NOT,!逻辑NOT

数组的操作的一些特性

1.对数组中数字集合的一些操作
(1)@avg返回collection中对象平均值,以NSNumber的形式返回
(2)@count集合中总共的个数,,以NSNumber的形式返回
(3)@min````@max````@sum分别表示返回集合中最小值,最大值,和总和.都是以NSNumber的形式返回.
(4)使用valueForKeyPath返回相应的结果

// 处理大量数字组成的数组的时候可以使用,可以方便的进行判断.然后进行下一步操作
NSArray *array = @[@(30),@(40),@(50)];
NSPredicate *pre = [NSPredicate
// 最小值是不是大于30
predicateWithFormat:@"@min.intValue > 30"];
BOOL ok = [pre evaluateWithObject:array];
// 可以使用key == value 来去的最小,最大,总和,平均等值.并且返回一个nsnumer类型的值
NSNumber *a =  [array11 valueForKeyPath:@"@min.intValue"];
NSLog(@"%d",a.intValue);

2.数组中存放对象的一些操作
(1) @distinctUnionOfObjects返回一个数组,这个数组是由操作符.右侧属性的值组成的,并且重复的值被过滤掉.@unionOfObjects逻辑和@distinctUnionOfObjects相同,但是重复的值没有被过滤掉
(2)@distinctUnionOfArrays返回的是数组,但是将数组中的数组元素拆分到一个数组里面,逻辑同上面,不包括重复值@unionOfArrays包括重复值
(3)返回值都是使用valueForKeyPath取到

CatModal *cat1 = [[CatModal alloc] initWithNickName:@"小明" withWeight:30.1];
CatModal *cat2 = [[CatModal alloc] initWithNickName:@"mimi" withWeight:33.1];

CatModal *cat4 = [[CatModal alloc] initWithNickName:@"fuu" withWeight:35.1];
CatModal *cat5 = [[CatModal alloc] initWithNickName:@"err" withWeight:35.1];

TestModal *test1 = [[TestModal alloc] initWithName:@"小七" withHeith:90.1 withCat:cat1];
TestModal *test2 = [[TestModal alloc] initWithName:@"小七" withHeith:80.1 withCat:cat2];
withHeith:60.1 withCat:cat3];

TestModal *test4 = [[TestModal alloc] initWithName:@"小七" withHeith:60.1 withCat:cat4];

TestModal *test5 = [[TestModal alloc] initWithName:@"小七" withHeith:60.1 withCat:cat5];

NSArray *array = @[test2,test1];
NSArray *array2 = @[test4,test5];
NSArray *arrayofarray = @[array,array2];


NSArray *array11111 = [array valueForKeyPath:@"@distinctUnionOfObjects.cat"];
for (CatModal *cat in array11111) {
    NSLog(@"%@\n",cat.nickName);[小明,mini]
}


NSArray *array1 = [arrayofarray valueForKeyPath:@"@distinctUnionOfArrays.cat"];
for (CatModal *cat in array1) {
    NSLog(@"%@\n",cat.nickName); // [fuu 小明 mimi err],并不是数组中的数组的形式
}

3.数组中的SELF指什么
数组中SELF指的是数组中包含的每一个对象

4.对数组中具体的某个位置进行操作查询

array[index]指定数组中指定索引处的元素进行匹配操作
array[FIRST]````array[LAST]````array[SIZE]分别表示对数组第一个,最后一个,数组总数进行操作

CatModal *cat1 = [[CatModal alloc] initWithNickName:@"小明" withWeight:30.1];
CatModal *cat2 = [[CatModal alloc] initWithNickName:@"mimi" withWeight:33.1];
CatModal *cat3 = [[CatModal alloc] initWithNickName:@"miru" withWeight:35.1];
CatModal *cat4 = [[CatModal alloc] initWithNickName:@"fuu" withWeight:35.1];
CatModal *cat5 = [[CatModal alloc] initWithNickName:@"err" withWeight:35.1];
CatModal *cat6 = [[CatModal alloc] initWithNickName:@"ooo" withWeight:35.1];
TestModal *test1 = [[TestModal alloc] initWithName:@"小七" withHeith:90.1 withCat:cat1];
test1.catsArray = @[cat2,cat1];

TestModal *test2 = [[TestModal alloc] initWithName:@"小七" withHeith:80.1 withCat:cat2];
test2.catsArray = @[cat4];
TestModal *test3 = [[TestModal alloc] initWithName:@"小七" withHeith:60.1 withCat:cat3];
test3.catsArray = @[cat5,cat6];

NSArray *array = @[test2,test1,test3];
NSPredicate *pre = [NSPredicate predicateWithFormat:@"catsArray[SIZE] == 1"];
NSArray *array1 = [array filteredArrayUsingPredicate:pre];
NSLog(@"11111%@",array1);

5.对数组中的数组进行操作的时候查询关键字,只能用在数组,一对多的形式
ANY或者SOME对数组中的数组进行查询,只要有符合条件的,就返回TRUE

ALL数组中所有都符合条件的时候才会返回。

NONE都不正确的时候才返回true。

CatModal *cat1 = [[CatModal alloc] initWithNickName:@"小明" withWeight:30.1];
CatModal *cat2 = [[CatModal alloc] initWithNickName:@"mimi" withWeight:33.1];
CatModal *cat3 = [[CatModal alloc] initWithNickName:@"miru" withWeight:35.1];
TestModal *test1 = [[TestModal alloc] initWithName:@"小七" withHeith:90.1 withCat:cat1];
test1.catsArray = @[cat2,cat3];

TestModal *test2 = [[TestModal alloc] initWithName:@"小七" withHeith:80.1 withCat:cat1];
test2.catsArray = @[cat2];
TestModal *test3 = [[TestModal alloc] initWithName:@"小七" withHeith:60.1 withCat:cat1];
test3.catsArray = @[cat1,cat3];
NSArray *array = @[test2,test1,test3];
// ALL ANY SOME 用于NSArray NSSet .ANY SOME是数组中有真的就返回. ALL是数组中全部是真的才返回
NSPredicate *pre = [NSPredicate predicateWithFormat:@"ALL catsArray.weight > 31.0"];
NSArray *array1 = [array filteredArrayUsingPredicate:pre];
NSLog(@"%@",array1);

注意:
1.查询过程中使用department.name这样的形式比较耗费性能.尽量不要使用.department == %@这样的形式查询效率最高.

  1. @"firstName beginswith[cd] 'Matt' AND (ANY directreports.paygrade <= 7)" 比下面这种形式更高效 @"(ANY directreports.paygrade <= 7) AND (firstName beginswith[cd] 'Matt')"
    3.使用predicate的类必须支持key-value-coding ,这样才可以在其他地方使用. 实际上使用predicate 也是根据key-value这样的形式来查询的.

4.[c],[d],[cd]可以加到比较符号的后面表示不区分大小写,不区分发音符号,两这个都不区分

5.如果想要匹配null或者nil值得时候,需要额外增加一条对比

predicate = [NSPredicate predicateWithFormat:@"(firstName == %@) || (firstName == nil)"];
filteredArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"%@", filteredArray);
最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 203,362评论 5 477
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 85,330评论 2 381
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 150,247评论 0 337
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 54,560评论 1 273
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 63,580评论 5 365
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 48,569评论 1 281
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 37,929评论 3 395
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 36,587评论 0 258
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 40,840评论 1 297
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 35,596评论 2 321
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 37,678评论 1 329
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 33,366评论 4 318
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 38,945评论 3 307
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 29,929评论 0 19
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 31,165评论 1 259
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 43,271评论 2 349
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 42,403评论 2 342

推荐阅读更多精彩内容

  • 第5章 引用类型(返回首页) 本章内容 使用对象 创建并操作数组 理解基本的JavaScript类型 使用基本类型...
    大学一百阅读 3,204评论 0 4
  • 没想到会喜欢这篇小说,有人这样评价:也许这不叫文风朴实,而叫废话太多;也许这本书的立意情怀满分,但就小说而言,我实...
    杨宝宝漫谈阅读 408评论 0 2
  • 1 非常餐馆里高脚杯碰高脚杯,唇滚唇那一刻,我的扫帚粉碎了现场的浪漫。我像小鸡啄米那样连连低头,赔礼道歉。眼前的这...
    在风阅读 925评论 18 26
  • 有两种方式使用in操作符:单独使用和在for-in循环中使用。在单独使用时,in操作符会在通过对象能够访问给定属性...
    落花的季节阅读 917评论 0 1
  • 题记:昨天杭州G20晚会惊艳了世界!西湖之上,月光之下,如梦如幻的山水倒影中....这场美轮美奂的视觉盛宴,我无法...
    轩窗笔记阅读 638评论 1 3