iOS的查询、过滤(NSPredicate)

原文:http://www.2cto.com/kf/201208/150608.html

参考:http://blog.csdn.net/iscape/article/details/7318021

参考:http://blog.csdn.net/zhulei1018/article/details/6777220

首先举一个例子:
匹配9-15个由字母/数字组成的字符串的正则表达式:
    NSString * regex = @"^[A-Za-z0-9]{9,15}$";
    NSPredicate *pred = [NSPredicate predicateWithFormat:@"SELF MATCHES %@", regex];
    BOOL isMatch = [pred evaluateWithObject:txtfldPhoneNumber.text];

Cocoa用NSPredicate描述查询的方式,原理类似于在数据库中进行查询

用BETWEEN,IN,BEGINWITH,ENDWITH,CONTAINS,LIKE这些谓词来构造NSPredicate,必要的时候使用SELF直接对自己进行匹配

//基本的查询  
NSPredicate *predicate; 
predicate = [NSPredicate predicateWithFormat: @"name == 'Herbie'"]; 
    BOOL match = [predicate evaluateWithObject: car]; 
    NSLog (@"%s", (match) ? "YES" : "NO"); 
//在整个cars里面循环比较  
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"]; 
    NSArray *cars = [garage cars]; 
    for (Car *car in [garage cars]) { 
        if ([predicate evaluateWithObject: car]) { 
            NSLog (@"%@", car.name); 
        } 
    } 
//输出完整的信息  
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"]; 
    NSArray *results; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 
//含有变量的谓词  
    NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"name == $NAME"]; 
    NSDictionary *varDict; 
    varDict = [NSDictionary dictionaryWithObjectsAndKeys: 
               @"Herbie", @"NAME", nil]; 
    predicate = [predicateTemplate predicateWithSubstitutionVariables: varDict]; 
    NSLog(@"SNORGLE: %@", predicate); 
    match = [predicate evaluateWithObject: car]; 
  NSLog (@"%s", (match) ? "YES" : "NO"); 
//注意不能使用$VARIABLE作为路径名,因为它值代表值  
//谓词字符窜还支持c语言中一些常用的运算符  
    
    predicate = [NSPredicate predicateWithFormat: 
                 @"(engine.horsepower > 50) AND (engine.horsepower < 200)"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"oop %@", results); 
    
    predicate = [NSPredicate predicateWithFormat: @"name < 'Newton'"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", [results valueForKey: @"name"]); 
//强大的数组运算符  
    predicate = [NSPredicate predicateWithFormat: 
                 @"engine.horsepower BETWEEN { 50, 200 }"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 
    
    NSArray *betweens = [NSArray arrayWithObjects: 
                         [NSNumber numberWithInt: 50], [NSNumber numberWithInt: 200], nil]; 
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower BETWEEN %@", betweens]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 
    predicateTemplate = [NSPredicate predicateWithFormat: @"engine.horsepower BETWEEN $POWERS"]; 
    varDict = [NSDictionary dictionaryWithObjectsAndKeys: betweens, @"POWERS", nil]; 
    predicate = [predicateTemplate predicateWithSubstitutionVariables: varDict]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 
//IN运算符  
    predicate = [NSPredicate predicateWithFormat: @"name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", [results valueForKey: @"name"]); 
    predicate = [NSPredicate predicateWithFormat: @"SELF.name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", [results valueForKey: @"name"]); 
    
    names = [cars valueForKey: @"name"]; 
    predicate = [NSPredicate predicateWithFormat: @"SELF IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"]; 
    results = [names filteredArrayUsingPredicate: predicate];//这里限制了SELF的范围  
    NSLog (@"%@", results); 
//BEGINSWITH,ENDSWITH,CONTAINS  
//附加符号,[c],[d],[cd],c表示不区分大小写,d表示不区分发音字符,cd表示什么都不区分  
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'Bad'"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 
    
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'HERB'"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 
    
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH[cd] 'HERB'"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 
//LIKE运算符(通配符)  
    predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '*er*'"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 
    
    predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '???er*'"]; 
    results = [cars filteredArrayUsingPredicate: predicate]; 
    NSLog (@"%@", results); 

//基本的查询
NSPredicate *predicate;
predicate = [NSPredicate predicateWithFormat: @"name == 'Herbie'"];
    BOOL match = [predicate evaluateWithObject: car];
    NSLog (@"%s", (match) ? "YES" : "NO");
//在整个cars里面循环比较
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"];
    NSArray *cars = [garage cars];
    for (Car *car in [garage cars]) {
        if ([predicate evaluateWithObject: car]) {
            NSLog (@"%@", car.name);
        }
    }
//输出完整的信息
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower > 150"];
    NSArray *results;
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
//含有变量的谓词
    NSPredicate *predicateTemplate = [NSPredicate predicateWithFormat:@"name == $NAME"];
    NSDictionary *varDict;
    varDict = [NSDictionary dictionaryWithObjectsAndKeys:
               @"Herbie", @"NAME", nil];
    predicate = [predicateTemplate predicateWithSubstitutionVariables: varDict];
    NSLog(@"SNORGLE: %@", predicate);
    match = [predicate evaluateWithObject: car];
  NSLog (@"%s", (match) ? "YES" : "NO");
//注意不能使用$VARIABLE作为路径名,因为它值代表值
//谓词字符窜还支持c语言中一些常用的运算符
  
    predicate = [NSPredicate predicateWithFormat:
                 @"(engine.horsepower > 50) AND (engine.horsepower < 200)"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"oop %@", results);
  
    predicate = [NSPredicate predicateWithFormat: @"name < 'Newton'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", [results valueForKey: @"name"]);
//强大的数组运算符
    predicate = [NSPredicate predicateWithFormat:
                 @"engine.horsepower BETWEEN { 50, 200 }"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
  
    NSArray *betweens = [NSArray arrayWithObjects:
                         [NSNumber numberWithInt: 50], [NSNumber numberWithInt: 200], nil];
    predicate = [NSPredicate predicateWithFormat: @"engine.horsepower BETWEEN %@", betweens];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
    predicateTemplate = [NSPredicate predicateWithFormat: @"engine.horsepower BETWEEN $POWERS"];
    varDict = [NSDictionary dictionaryWithObjectsAndKeys: betweens, @"POWERS", nil];
    predicate = [predicateTemplate predicateWithSubstitutionVariables: varDict];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
//IN运算符
    predicate = [NSPredicate predicateWithFormat: @"name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", [results valueForKey: @"name"]);
    predicate = [NSPredicate predicateWithFormat: @"SELF.name IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", [results valueForKey: @"name"]);
  
    names = [cars valueForKey: @"name"];
    predicate = [NSPredicate predicateWithFormat: @"SELF IN { 'Herbie', 'Snugs', 'Badger', 'Flap' }"];
    results = [names filteredArrayUsingPredicate: predicate];//这里限制了SELF的范围
    NSLog (@"%@", results);
//BEGINSWITH,ENDSWITH,CONTAINS
//附加符号,[c],[d],[cd],c表示不区分大小写,d表示不区分发音字符,cd表示什么都不区分
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'Bad'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
  
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH 'HERB'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
  
    predicate = [NSPredicate predicateWithFormat: @"name BEGINSWITH[cd] 'HERB'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
//LIKE运算符(通配符)
    predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '*er*'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);
  
    predicate = [NSPredicate predicateWithFormat: @"name LIKE[cd] '???er*'"];
    results = [cars filteredArrayUsingPredicate: predicate];
    NSLog (@"%@", results);

时间: 2024-10-31 04:56:21

iOS的查询、过滤(NSPredicate)的相关文章

Oracle基本查询过滤排序示例解析

以下是对Oracle中的基本查询过滤排序示例进行了详细的分析介绍,需要的朋友可以参考下   基本查询: 复制代码 代码如下: --查询所有员工的信息 select * from emp; --设置行宽 set linesize 120; --设置列宽为四个数字的宽度 col empno for 9999; --设置列宽,a表示字符串共八位长度 col ename for a8 --设置pageSize每页显示30条记录 set pagesize 30; --sql中支持算数表达式,注意:如果一个

自定义 Azure Table storage 查询过滤条件

本文是在Azure Table storage 基本用法一文的基础上,介绍如何自定义 Azure Table storage 的查询过滤条件.如果您还不太清楚 Azure Table storage 的基本用法,请先移步前文. 让我们回到前文中提到的一个问题,如何过滤出 MyLogTable 表中某一天产生的所有日志?在进入细节之前,我们先来回顾一下 MyLogTable 类的设计: internal class MyLogEntity : TableEntity { public MyLogE

PostgreSQL multipolygon 空间索引查询过滤精简优化 - IO,CPU放大优化

标签 PostgreSQL , PostGIS , 空间数据 , 多边形 , bound box , R-Tree , GiST , SP-GiST 背景 在PostgreSQL中,目前对于空间对象的索引,采用的是GiST索引方法,空间树结构如下,每个ENTRY都是一个BOX: 如果对象是多边形,那么在索引结构中,会存储这个多边形的bound box. 那么对于非box类型,一定是会出现空间放大的. 另一方面,如果输入条件是个多边形,那么同样会将这个多边形的BOUND BOX作为输入条件,根据查

Oracle基本查询过滤排序示例解析_oracle

基本查询: 复制代码 代码如下: --查询所有员工的信息select * from emp;--设置行宽set linesize 120;--设置列宽为四个数字的宽度col empno for 9999;--设置列宽,a表示字符串共八位长度col ename for a8--设置pageSize每页显示30条记录set pagesize 30;--sql中支持算数表达式,注意:如果一个表达式中含有空值,则整个表达式为空select empno,ename,sal,sal*12,comm,sal*

Oracle基本查询过滤排序实例

基本查询: view plain --查询所有员工的信息   select * from emp;   --设置行宽   set linesize 120;   --设置列宽为四个数字的宽度   col empno for 9999;   --设置列宽,a表示字符串共八位长度   col ename for a8   --设置pageSize每页显示30条记录   set pagesize 30;   --sql中支持算数 表达式,注意:如果一个表达式中含有空值,则整个表达式为空   selec

多国语言字符串的加密、全文检索、模糊查询的支持

标签 PostgreSQL , 全文检索 , 模糊查询 , 前后模糊 , 多国字符串 , 透明加密 , 不可逆加密 , 可逆加密 , 函数安全 , C函数 背景 PostgreSQL中的全文检索和模糊查询是很好实现的. 通过pg_trgm插件,可以实现模糊查询(前.后.全模糊),近似查询,正则表达式查询的索引加速. 通过中文分词插件(pg_jieba, pg_scws, zhparser),可以实现中文分词,其他语种的分词,参考对应的插件. 但是,如果要让数据库支持加密存储,同时对加密前的数据实

NSPredicate匹配中文正

在 iOS 中,我们使用 NSPredicate 的字符串比较功能来进行正则表达式处理,其比较关键字为:MATCHES 下面,列举一个匹配6-15个由字母/数字组成的字符串的正则表达式,来看看 NSPredicate 的具体使用:      NSString * regex        = @"(^[A-Za-z0-9]{6,15}$)"; NSPredicate * pred      = [NSPredicate predicateWithFormat:@"SELF M

AngularJS 过滤与排序详解及实例代码_AngularJS

前面了解了AngularJS的使用方法,这里就简单的写个小程序,实现查询过滤以及排序的功能. 本程序中可以了解到: 1 angularjs的过滤器 2 ng-repeat的使用方法 3 控制器的使用 4 数据的绑定 程序设计分析 首先,如果要是先查询过滤,就要使用到AngularJS中的 过滤器filter 了. 直接在表达式的后面使用管道命令符 | ,按照下面的写法就可以达到一个过滤的效果: {{ persons | filter:query }} 通过使用filter实现过滤操作,query

java Hibernate框架Session的保存、更新、删除和查询教程

session的save方法 使一个临时对象变为持久化对象.session的save方法完成以下操作:1.把customer对象加入到缓存中,使他变为持久化对象2.选用映射文件指定的标识符生成器为持久化对象分配唯一的OID.Customer.hbm.xml文件中id元素的子元素指定标识符生成器: <generator><id name="id" column="ID" >    <generator class="increm