使用包含的谓词比较两列



我有一个核心数据实体,具有两个列: 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-Zartist.name = Beyoncé行返回True。

如何使用contains谓词比较两列?

谓词的使用有很多文章。虽然现在是几年前... Nshipster的一篇非常好的文章。

这是Apple文档的一些链接:

  • nspredicate;
  • 谓词格式字符串语法;
  • 谓词编程指南。

您问题的答案在于错误消息 lhs和RHS两个键

you 写了一个简单的谓词为:

nspredicate(格式:键盘比较器键(

在您的情况下,您应该写一个简单的谓词为:

nspredicate(格式:键盘比较器 value(


更新

我正试图使我的答案简短,以鼓励OP对谓词语法发展理解...但是也许需要更多的解释...

您有一个核心数据实体,我猜想将其命名为Artist,其中以下内容:

  • 类型String和名称artistName;
  • 的属性
  • 类型Artist(猜测?(和名称name
  • 的关系

您想检查artistNamename是否包含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(