NSPredicate 的用法举例

2024-05-08 23:18
文章标签 用法 举例 nspredicate

本文主要是介绍NSPredicate 的用法举例,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

Cocoa 提供了一个名为NSPredicate的类,用于指定过滤器的条件,用NSPredicate描述查询方式,原理类似于在数据库中进行查询。可以在数据库风格的API中使用NSPredicate类,常见的用于Core Data和Spotlight。Predicate是一个返回Boolean值的表达式,可以看做是if或while里面的条件表达式,Predicate不依赖于被搜索的具体数据,而是提供一种检索数据的抽象查询定义。 本文讲解过程中用到了部分类比如garage(车库的类),car(车)等仅供举例,未列出创建代码,体会predicate的用法才是关键。


创建Predicate.

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name == 'Herbie'"];

计算Predicate

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"engine.horsepowe > 150"];NSArray *cars = [garage cars];for (Car *car in [garage cars]) {if ([predicate evaluateWithObject:car]) {NSLog(@"%@",car.name);}}

遍历数组取出符合条件的对象。


数组过滤器

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"engine.horsepowe > 150"];NSArray *results;results = [cars filteredArrayUsingPredicate:predicate];

假如你有一个可变数组,而且需要剔除不属于该数组的所有项目。使用以下方法:

    NSMutableArray *carsCopy = [cars mutableCopy];[carsCopy filterUsingPredicate:predicate];



构造灵活Predicate

有两种方式,

第一种 格式说明符

    NSPredicate *predicate1, *predicate2, *predicate3;predicate1 = [NSPredicate predicateWithFormat:@"engine.horsepowe > %d",50];predicate2 = [NSPredicate predicateWithFormat:@"name == %@",@"Herbie"];predicate3 = [NSPredicate predicateWithFormat:@"%k == %@", @"name", @"Herbie"];

第二种 将变量名放入字符串中,类似于环境变量

此predicate等价于第一种里的的predicate3和predicate2

    NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"name == $NAME"];NSDictionary *varDict;varDict = [NSDictionary dictionaryWithObjectsAndKeys:@"Herbie",@"NAME", nil];NSPredicate *predicate = [predicateTemplate predicateWithSubstitutionVariables:varDict];


而此predicate等价于第一种里的predicate1

    predicateTemplate = [NSPredicate predicateWithFormat:@"engine.horsepower > $POWER"];varDict = [NSDictionary dictionaryWithObjectsAndKeys:[NSNumber numberWithInt:150], @"POWER", nil];predicate = [predicateTemplate predicateWithSubstitutionVariables:varDict];



predicate的运算符

支持C语言的常用运算符 ==    =    >    <    >=    <=   !=    <>   &&    ||   !   AND    OR   NOT等

    predicate = [NSPredicate predicateWithFormat:@"(engine.horsepower > 50) AND (engine.horsepower < 200)"];results = [cars filteredArrayUsingPredicate:predicate];

数组运算符

    predicate = [NSPredicate predicateWithFormat:@"engine.horsepower BETWEEN{50,200}"];

等价于

    NSArray *betweens = [NSArray arrayWithObjects:[NSNumber numberWithInt:50],[NSNumber numberWithInt:200],nil];predicate = [NSPredicate predicateWithFormat:@"engine.horsepower BEWEEN %@",betweens];

SELF 关键词响应predicate计算对象

    NSArray *names1 = [NSArray arrayWithObjects:@"Herbie",@"Badger",@"Judge",@"Elvis", nil];NSArray *names2 = [NSArray arrayWithObjects:@"Judge",@"Paper Car",@"Badger",@"Phoenix", nil];predicate = [NSPredicate predicateWithFormat:@"SELF IN %@", names1];results = [names2 filteredArrayUsingPredicate:predicate];NSLog(@"%@", results);

答案是:

(
  Judge,

  Badger

)


字符串运算符

BEGINSWITH       检查某个字符串是否以另一个字符串开头

ENDSWITH           检查某个字符串是否以另一个字符串结尾


CONTAINS            检查某个字符串是否在另一个字符串内部

比如使用 "name BEGINSWITH 'Bad' " 匹配Badger
匹配是区分大小写的,如果匹配BADGer就匹配不得了

要忽视大小写及重音符等规则,可以前面加上[cd]
" name BEGINSWITH [cd] 'HERB' " 匹配 Herbie 即可匹配成功  ,通常加上[cd]比较好


LIKE运算符

" name LIKE  ' *er* '  "将会与任何含有er的名称匹配,等价于CONTAINS
" name LIKE  ' ???er*  '  "将会与Paper Car 匹配 但不会与Badger匹配,er前面限定了三个字符
如果你热衷于正则表达式,可以使用MATCHES 运算符,赋给它一个正则表达式。


转载请注明原著:http://blog.csdn.net/marvindev


CoreData Prdicate 支持的运算符和参数

Basic Comparisons: =, ==, >=, =>, <=, =<, >, <, !=, <>, BETWEEN{low, high}

Boolean: AND (&&), OR(||), NOT(!)

String: BEGINSWITH, CONTSINS, ENDSWITH, LIKE, MATCHES

Aggregate:  ANY, SOME, ALL, NONE, IN

Literals: FALSE, NO, TRUE, YES, NULL, NIL, SELF.   (Core data 还支持字符串和数字字面量)







这篇关于NSPredicate 的用法举例的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/971721

相关文章

mysql中insert into的基本用法和一些示例

《mysql中insertinto的基本用法和一些示例》INSERTINTO用于向MySQL表插入新行,支持单行/多行及部分列插入,下面给大家介绍mysql中insertinto的基本用法和一些示例... 目录基本语法插入单行数据插入多行数据插入部分列的数据插入默认值注意事项在mysql中,INSERT I

mapstruct中的@Mapper注解的基本用法

《mapstruct中的@Mapper注解的基本用法》在MapStruct中,@Mapper注解是核心注解之一,用于标记一个接口或抽象类为MapStruct的映射器(Mapper),本文给大家介绍ma... 目录1. 基本用法2. 常用属性3. 高级用法4. 注意事项5. 总结6. 编译异常处理在MapSt

Python包管理工具核心指令uvx举例详细解析

《Python包管理工具核心指令uvx举例详细解析》:本文主要介绍Python包管理工具核心指令uvx的相关资料,uvx是uv工具链中用于临时运行Python命令行工具的高效执行器,依托Rust实... 目录一、uvx 的定位与核心功能二、uvx 的典型应用场景三、uvx 与传统工具对比四、uvx 的技术实

Python中使用uv创建环境及原理举例详解

《Python中使用uv创建环境及原理举例详解》uv是Astral团队开发的高性能Python工具,整合包管理、虚拟环境、Python版本控制等功能,:本文主要介绍Python中使用uv创建环境及... 目录一、uv工具简介核心特点:二、安装uv1. 通过pip安装2. 通过脚本安装验证安装:配置镜像源(可

java中long的一些常见用法

《java中long的一些常见用法》在Java中,long是一种基本数据类型,用于表示长整型数值,接下来通过本文给大家介绍java中long的一些常见用法,感兴趣的朋友一起看看吧... 在Java中,long是一种基本数据类型,用于表示长整型数值。它的取值范围比int更大,从-922337203685477

MyBatis ResultMap 的基本用法示例详解

《MyBatisResultMap的基本用法示例详解》在MyBatis中,resultMap用于定义数据库查询结果到Java对象属性的映射关系,本文给大家介绍MyBatisResultMap的基本... 目录MyBATis 中的 resultMap1. resultMap 的基本语法2. 简单的 resul

Python主动抛出异常的各种用法和场景分析

《Python主动抛出异常的各种用法和场景分析》在Python中,我们不仅可以捕获和处理异常,还可以主动抛出异常,也就是以类的方式自定义错误的类型和提示信息,这在编程中非常有用,下面我将详细解释主动抛... 目录一、为什么要主动抛出异常?二、基本语法:raise关键字基本示例三、raise的多种用法1. 抛

Java中常见队列举例详解(非线程安全)

《Java中常见队列举例详解(非线程安全)》队列用于模拟队列这种数据结构,队列通常是指先进先出的容器,:本文主要介绍Java中常见队列(非线程安全)的相关资料,文中通过代码介绍的非常详细,需要的朋... 目录一.队列定义 二.常见接口 三.常见实现类3.1 ArrayDeque3.1.1 实现原理3.1.2

java中Optional的核心用法和最佳实践

《java中Optional的核心用法和最佳实践》Java8中Optional用于处理可能为null的值,减少空指针异常,:本文主要介绍java中Optional核心用法和最佳实践的相关资料,文中... 目录前言1. 创建 Optional 对象1.1 常规创建方式2. 访问 Optional 中的值2.1

git stash命令基本用法详解

《gitstash命令基本用法详解》gitstash是Git中一个非常有用的命令,它可以临时保存当前工作区的修改,让你可以切换到其他分支或者处理其他任务,而不需要提交这些还未完成的修改,这篇文章主要... 目录一、基本用法1. 保存当前修改(包括暂存区和工作区的内容)2. 查看保存了哪些 stash3. 恢