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

相关文章

Python中logging模块用法示例总结

《Python中logging模块用法示例总结》在Python中logging模块是一个强大的日志记录工具,它允许用户将程序运行期间产生的日志信息输出到控制台或者写入到文件中,:本文主要介绍Pyt... 目录前言一. 基本使用1. 五种日志等级2.  设置报告等级3. 自定义格式4. C语言风格的格式化方法

SpringBoot 获取请求参数的常用注解及用法

《SpringBoot获取请求参数的常用注解及用法》SpringBoot通过@RequestParam、@PathVariable等注解支持从HTTP请求中获取参数,涵盖查询、路径、请求体、头、C... 目录SpringBoot 提供了多种注解来方便地从 HTTP 请求中获取参数以下是主要的注解及其用法:1

Python 基于http.server模块实现简单http服务的代码举例

《Python基于http.server模块实现简单http服务的代码举例》Pythonhttp.server模块通过继承BaseHTTPRequestHandler处理HTTP请求,使用Threa... 目录测试环境代码实现相关介绍模块简介类及相关函数简介参考链接测试环境win11专业版python

Java中HashMap的用法详细介绍

《Java中HashMap的用法详细介绍》JavaHashMap是一种高效的数据结构,用于存储键值对,它是基于哈希表实现的,提供快速的插入、删除和查找操作,:本文主要介绍Java中HashMap... 目录一.HashMap1.基本概念2.底层数据结构:3.HashCode和equals方法为什么重写Has

Android协程高级用法大全

《Android协程高级用法大全》这篇文章给大家介绍Android协程高级用法大全,本文结合实例代码给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友跟随小编一起学习吧... 目录1️⃣ 协程作用域(CoroutineScope)与生命周期绑定Activity/Fragment 中手

Python异步编程之await与asyncio基本用法详解

《Python异步编程之await与asyncio基本用法详解》在Python中,await和asyncio是异步编程的核心工具,用于高效处理I/O密集型任务(如网络请求、文件读写、数据库操作等),接... 目录一、核心概念二、使用场景三、基本用法1. 定义协程2. 运行协程3. 并发执行多个任务四、关键

Python WebSockets 库从基础到实战使用举例

《PythonWebSockets库从基础到实战使用举例》WebSocket是一种全双工、持久化的网络通信协议,适用于需要低延迟的应用,如实时聊天、股票行情推送、在线协作、多人游戏等,本文给大家介... 目录1. 引言2. 为什么使用 WebSocket?3. 安装 WebSockets 库4. 使用 We

Python中yield的用法和实际应用示例

《Python中yield的用法和实际应用示例》在Python中,yield关键字主要用于生成器函数(generatorfunctions)中,其目的是使函数能够像迭代器一样工作,即可以被遍历,但不会... 目录python中yield的用法详解一、引言二、yield的基本用法1、yield与生成器2、yi

深度解析Python yfinance的核心功能和高级用法

《深度解析Pythonyfinance的核心功能和高级用法》yfinance是一个功能强大且易于使用的Python库,用于从YahooFinance获取金融数据,本教程将深入探讨yfinance的核... 目录yfinance 深度解析教程 (python)1. 简介与安装1.1 什么是 yfinance?

MySQL中REPLACE函数与语句举例详解

《MySQL中REPLACE函数与语句举例详解》在MySQL中REPLACE函数是一个用于处理字符串的强大工具,它的主要功能是替换字符串中的某些子字符串,:本文主要介绍MySQL中REPLACE函... 目录一、REPLACE()函数语法:参数说明:功能说明:示例:二、REPLACE INTO语句语法:参数