Cocoa用NSPredicate 描述查询的方式,原理类似于在数据库中进行查询。
创建
在即将NSPredicate 应用于某个对象之前,首先需要创建它。有两种基本方式:
- 创建许多对象,并将它们组合起来。
- 查询代码中的字符串。
Car *car;
car = makeCar(@"Herbie",@"Honda",@"CRX",1984,2,110000,58);
[garage addCar:car ];
//创建谓词
NSPredicate *predicate ; //<span style="font-family: Arial, Helvetica, sans-serif;">predicate</span><span style="font-family: Arial, Helvetica, sans-serif;">对象指针指向</span><span style="font-family: Arial, Helvetica, sans-serif;">NSPredicate</span><span style="font-family: Arial, Helvetica, sans-serif;">
</span>
predicate =[NSPredicate predicateWithFormat:@"name == 'Herbie' "]; //使用+<span style="font-family: Arial, Helvetica, sans-serif;">predicateWithFormat:在后台构建对象树,这些树将用来计算谓词的值</span>
计算谓词
这里的“谓词”通常用在数学和计算机科学概念中,表示计算真值和假值得函数。
BOOL match =[predicate evaluateWithObject:car ]; //+<span style="font-family:Arial, Helvetica, sans-serif;">evaluateWithObject:通知接收对象(谓词)根据制定的对象计算自身的值。本例中的接收对象时car </span>
NSLog(@"%s ",(match )?"YES":"NO");//match为键路径
predicate = [NSPredicate predicateWithFormat:@"engine.horsepower >150 "];//字符串左侧是一个键路径,该键路径连接到汽车内部,查找引擎马力,将马力值与150比较大小。
match = [predicate evaluateWithObject: car ];//通过计算内容match
燃料过滤器
-filteredArrayUsingPredicate:是NSNarry 数组中的一种类别方法,它将循环顾虑数组内容,根据谓词计算每个对象的值,并将值为YES的对象累积到将被返回的新数组中。
NSArray *results;
results =[cars filteredArrayUsingPredicate:predicate ];
NSLog(@"%@",result );
格式说明符
可以通过两种方式将不同的内容放入谓词格式字符串中:
- 格式说明符
predicate = [NSPredicate predicateWithFormat:@"name==%@",@"Herbie"];
//使用格式说明符
NSPredicate *predicateTemplate =[NSPredicate predicateWithFormat:@"name ==$NAME "];
- 变量名
运算符
NSPredicate的格式字符串包含戴昂不同的运算符。
- 比较和逻辑运算符
- 等号运算符==和=
- 不等号运算符
- >: 大于
- >=和=>: 大于或等于
- <: 小于
- <=和=<: 小于或等于
- !=和<>: 不等于
- 括号表达式
- AND 、OR、NOT逻辑运算符
- C样式的等效表达式&&、||、!
- 数组运算符
SELF
SELF可以引用用于谓词计算的对象。通常将为此中所有的键路径表示成对应的SELF.
predicate= [NSPredicate predicateWithFormat:@"SELF.name IN{'Herbie','Snugs','Badger','Flap'}"];
字符串运算符
关系运算符:
- BEGINSWITH:检查某个字符串是否以另一个字符串开头
- ENDSWITH:检查某个字符串是否以另一个字符串结尾
- CONTAINS:检查某个字符串是否在另一个字符串内部
例如:“name BEGINSWITH ‘bad’ ”匹配"Badger "
LIKE 运算符
在该运算符中,?表示与一个字符匹配,*表示与人一个字符相匹配。(有时称为“通配符”,听起来很耳熟)
例如:“name LIKE '*er* ' ”会与任何含有“er ”的名称相匹配