【问题标题】:NSPredicate: search for an array of values in relation, NOTNSPredicate:搜索相关值的数组,NOT
【发布时间】:2021-09-28 16:27:24
【问题描述】:

我有点迷茫,希望你能帮帮我。

我有两个数组

let stars = ["Paul", "Ringo"]
let visitors = ["bob", "mary"]

然后我有 Core Data 实体 Rockstar 和 Person。以及两者之间的一对多关系fans。

现在我想找到几个特定的​​ Rockstar,并确保他们没有访客作为粉丝。

我尝试使用复合谓词来做到这一点,大致如下:

let starsPredicate = NSPredicate(format: "id IN %@", stars)
let fansPredicate = NSPredicate(format: "NOT (fans.personid CONTAINS %@)", visitors)

最后

let compoundPredicate = NSCompoundPredicate(andPredicateWithSubpredicates: [starsPredicate, fansPredicate])

恐怕这会导致两个问题:

  1. fansPredicate 的正确语法是什么?它适用于一个值,但它在数组上崩溃

  2. 复合谓词有可能吗?我认为如果 Person 实体为空,我会从复合谓词中得到零记录。

【问题讨论】:

  • 你不应该对粉丝使用相同的逻辑“IN”吗?看到stackoverflow.com/questions/8580715/…然后?
  • 试过了,崩溃了
  • 如果它崩溃了,你可能想在控制台中分享错误信息?
  • [error] 错误:SQLCore dispatchRequest:异常处理请求:,未实现的谓词 SQL 生成:(fans.personid IN {"173A0057-C55D-4F1E-9CD8-42627813F822"} ) 用户信息为 (null)
  • 你可能需要一个子查询,比如NSPredicate(format: "SUBQUERY(fans, $f, $f.personid IN %@).@count = 0", visitors)

标签: ios swift core-data nscompoundpredicate


【解决方案1】:

这可以通过“SUBQUERY”来实现:

let fansPredicate = NSPredicate(format: "SUBQUERY(fans, $f, $f.personid IN %@).@count = 0",
                                visitors)

该谓词适用于所有 Rockstar 对象,这些对象没有相关的 Person 对象,其 personId 在给定列表中。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多