谓词编程指南(摘要)
- 谓词概览
- 创建谓词
- 使用格式化字符串创建谓词
- 字符串常量、变量及通配符
- 布尔值
- 动态属性名
- 在代码中创建谓词
- 使用谓词模板创建谓词
- 格式化字符串总结
- 使用格式化字符串创建谓词
- 使用谓词
- 对谓词进行评估
- 谓词与数组结合
- 在谓词中使用键路径
- Null值
- 性能
- 谓词格式化字符串语法
- 分析器基本要素
- 基本比较
- 布尔值谓词
- 基本复合谓词
- 字符串比较
- 集合操作
- 标识符
- 字面量
- 保留字
在Cocoa中,谓词提供了指定查询的一个通用手段。谓词系统在多个领域都是能干的,包括Core Data及Spotlight。谓词是一个逻辑操作符,只返回布尔值。
两类谓词:
- 比较谓词:使用一个操作符比较两个表达式。
- 复合谓词:比较两个或更多谓词的结果,或否定其它谓词。
谓词的类型比较广泛,包括:
- 简单比较,如grade == 7或firstName like ‘Mark’
- 不区分大小写或字符的查找,如name contains[cd] ‘citroen’
- 逻辑操作,如(firstName begins with ‘M’) AND (lastName like ‘Adderley’)
与谓词相关的类:nspredicate、NSComparisonPredicate、NSCompoundPredicate。
谓词表达式是用NSExpression表示的。
谓词的局限性:
不提供并集、交集功能。谓词能不能正常工作,与操作符相关,也与后台存储相关,例如:
matches操作符使用了regex,尽管它可以在内存过滤中工作,但不被Core Data的sql存储所支持。
Core Data的sql存储的每次查询只支持一对多操作,此时,谓词中只能使用ALL、ANY、IN三个操作符中的一个。
创建谓词
使用格式化字符串创建谓词
使用nspredicate的类方法predicateWithFormat:创建谓词。
|
1
|
nspredicate
*predicate
=
[
nspredicate
predicateWithFormat
:
@"(lastName like[cd] %@) AND (birthday > %@)"
,
lastNameSearchString
birthdaySearchDate
]
;
|
在这个示例中,[cd]表示大小写及发音符号不敏感。
谓词字符串分析器对空白不敏感,对关键字大小写不敏感,支持嵌套的括号表达式。也支持格式化参数,例如%x、%@。在谓词中,可以使用$指示一个变量,例如$VAR_NAME。分析器不会进行语法检查。
字符串常量、变量及通配符
字符串常量必须使用引号,单引号、双引号均可,但单引号不能匹配双引号。使用变量置换时,例如firstName like %@,此时,引号会被自动添加进去。如果在格式化字符串中使用了字符串常量,就必须自己对其添加引号。
|
1
|
nspredicate
*predicate
=
[
nspredicate
predicateWithFormat
:
@"lastName like[c] \"S*\""
]
;
|
使用通配符时,要先将通配符添加到变量中,然后再进行置换。
1
2
3
4
Nsstring
*prefix
@"prefix"
;
*suffix
@"suffix"
;
@"SELF like[c] %@"
[
[
prefix
stringByAppendingString
@"*"
]
stringByAppendingString
:suffix
;
BOOL
ok
predicate
evaluateWithObject
@"prefixxxxxxsuffix"
;
上面的示例,得到的谓词字符串是SELF LIKE[c] “prefix*suffix”,ok的值是YES。
但如果是这样写:
1
2
predicate
@"SELF like[c] %@*%@"
,
prefix
suffix
;
ok
[
predicate
evaluateWithObject
@"prefixxxxxxsuffix"
;