我有一个核心数据实体,具有两个列: artistName
,类型字符串,以及与具有类型字符串的另一个列name
的实体的关系。
我可以创建一个谓词,该谓词比较了这两个列,例如:
NSPredicate(format: "artistName == artist.name")
因此,对于artistName = Beyoncé
和artist.name = Beyoncé
的行,此谓词返回true。
但是,如果我将其更改为使用contains
,则它不起作用:
NSPredicate(format: "artistName contains artist.name")
上面的代码导致此错误:
由于未被发现的例外" nsinvalidargumentException"终止应用程序,原因是:'predicate的未完成的SQL生成:( ArtistName包含Artist.name(
我想使用contains
创建一个谓词,例如,使用artistName = Beyoncé feat. Jay-Z
和artist.name = Beyoncé
行返回True。
如何使用contains
谓词比较两列?
谓词的使用有很多文章。虽然现在是几年前... Nshipster的一篇非常好的文章。
这是Apple文档的一些链接:
- nspredicate;
- 谓词格式字符串语法;
- 谓词编程指南。
您问题的答案在于错误消息 lhs和RHS两个键。
you 写了一个简单的谓词为:
nspredicate(格式:键盘比较器键(
在您的情况下,您应该写一个简单的谓词为:
nspredicate(格式:键盘比较器 value(
更新
我正试图使我的答案简短,以鼓励OP对谓词语法发展理解...但是也许需要更多的解释...
您有一个核心数据实体,我猜想将其命名为Artist
,其中以下内容:
- 类型
String
和名称artistName
;
的属性 - 类型
Artist
(猜测?(和名称name
。
的关系
您想检查artistName
和name
是否包含String
"Beyoncé"。
您如何进行比较???以我的拙见,不可能。
您需要两个比较:
- 检查属性的值
artistName
是否包含"碧昂斯"; - 检查关系的价值
name
是否包含"碧昂斯"。
那么如何用两个比较编写"比较"谓词?
有多种方法。
从长远来看,我鼓励您调查NSCompoundPredicate
的力量,因为我敢肯定它将在将来为您服务。
与此同时,您可以使用以下语法编写"两个比较"谓词...
let predicate = NSPredicate(format: "(artistName contains 'Beyoncé') AND (name.artistName contains 'Beyoncé')")
或动态/普遍...
let keypath1: String = "artistName"
let keypath2: String = "name.artistName"
let value: String = "Beyoncé"
let predicate = NSPredicate(format: "(%K contains %@) AND (%K contains %@)", argumentArray: [keypath1, value, keypath2, value])
注意:
- 您必须穿越关系;和
- 您可能需要以
contains[cd]
的形式写入比较案例不敏感和不敏感的比较,从而处理诸如"é"等角色。
您现在可能会看到,在您的问题中,第一个==
比较器之所以起作用,是因为您实际上比较了两个隐含的字符串值。第二个contains
不起作用,因为谓词语法规则期望第二个参数是一个值(lhs a键盘和rhs值(。Swift正在阅读第二个contains
,为"属性artistName
包含与关系name
相关联的实体"
迭戈·弗雷尼奇(Diego Freniche(建立了一个游乐场来展示谓词的使用……也许值得寻找实用的例子?(https://github.com/dfreniche/nspredicate-swift(