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

相关文章

C语言中%zu的用法解读

《C语言中%zu的用法解读》size_t是无符号整数类型,用于表示对象大小或内存操作结果,%zu是C99标准中专为size_t设计的printf占位符,避免因类型不匹配导致错误,使用%u或%d可能引发... 目录size_t 类型与 %zu 占位符%zu 的用途替代占位符的风险兼容性说明其他相关占位符验证示

MySQL中EXISTS与IN用法使用与对比分析

《MySQL中EXISTS与IN用法使用与对比分析》在MySQL中,EXISTS和IN都用于子查询中根据另一个查询的结果来过滤主查询的记录,本文将基于工作原理、效率和应用场景进行全面对比... 目录一、基本用法详解1. IN 运算符2. EXISTS 运算符二、EXISTS 与 IN 的选择策略三、性能对比

全面解析Golang 中的 Gorilla CORS 中间件正确用法

《全面解析Golang中的GorillaCORS中间件正确用法》Golang中使用gorilla/mux路由器配合rs/cors中间件库可以优雅地解决这个问题,然而,很多人刚开始使用时会遇到配... 目录如何让 golang 中的 Gorilla CORS 中间件正确工作一、基础依赖二、错误用法(很多人一开

Java Stream流之GroupBy的用法及应用场景

《JavaStream流之GroupBy的用法及应用场景》本教程将详细介绍如何在Java中使用Stream流的groupby方法,包括基本用法和一些常见的实际应用场景,感兴趣的朋友一起看看吧... 目录Java Stream流之GroupBy的用法1. 前言2. 基础概念什么是 GroupBy?Stream

Java Thread中join方法使用举例详解

《JavaThread中join方法使用举例详解》JavaThread中join()方法主要是让调用改方法的thread完成run方法里面的东西后,在执行join()方法后面的代码,这篇文章主要介绍... 目录前言1.join()方法的定义和作用2.join()方法的三个重载版本3.join()方法的工作原

Java Spring的依赖注入理解及@Autowired用法示例详解

《JavaSpring的依赖注入理解及@Autowired用法示例详解》文章介绍了Spring依赖注入(DI)的概念、三种实现方式(构造器、Setter、字段注入),区分了@Autowired(注入... 目录一、什么是依赖注入(DI)?1. 定义2. 举个例子二、依赖注入的几种方式1. 构造器注入(Con

详解MySQL中JSON数据类型用法及与传统JSON字符串对比

《详解MySQL中JSON数据类型用法及与传统JSON字符串对比》MySQL从5.7版本开始引入了JSON数据类型,专门用于存储JSON格式的数据,本文将为大家简单介绍一下MySQL中JSON数据类型... 目录前言基本用法jsON数据类型 vs 传统JSON字符串1. 存储方式2. 查询方式对比3. 索引

全面掌握 SQL 中的 DATEDIFF函数及用法最佳实践

《全面掌握SQL中的DATEDIFF函数及用法最佳实践》本文解析DATEDIFF在不同数据库中的差异,强调其边界计算原理,探讨应用场景及陷阱,推荐根据需求选择TIMESTAMPDIFF或inte... 目录1. 核心概念:DATEDIFF 究竟在计算什么?2. 主流数据库中的 DATEDIFF 实现2.1

MySQL中的LENGTH()函数用法详解与实例分析

《MySQL中的LENGTH()函数用法详解与实例分析》MySQLLENGTH()函数用于计算字符串的字节长度,区别于CHAR_LENGTH()的字符长度,适用于多字节字符集(如UTF-8)的数据验证... 目录1. LENGTH()函数的基本语法2. LENGTH()函数的返回值2.1 示例1:计算字符串

Java中的数组与集合基本用法详解

《Java中的数组与集合基本用法详解》本文介绍了Java数组和集合框架的基础知识,数组部分涵盖了一维、二维及多维数组的声明、初始化、访问与遍历方法,以及Arrays类的常用操作,对Java数组与集合相... 目录一、Java数组基础1.1 数组结构概述1.2 一维数组1.2.1 声明与初始化1.2.2 访问