如何在 swift 中创建提取请求谓词,该谓词不包括相关实体中具有给定属性的项目



我有两个相互关联的实体。第一个是事务实体,它与名为 Tag 的另一个实体具有多对多关系。因此,一个事务可以有多个标签,一个标签可以有多个事务。

我有一个从核心数据中获取数据的方法,该方法可以返回使用给定标签标记的结果。我使用的谓词如下所示:

fetchRequest.predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (ANY tags IN %@)", argumentArray: [startDate, endDate, tags])

它工作得很好。现在我想做的是创建另一个具有以另一种方式过滤结果的谓词的获取请求。这是返回没有给定标签的结果。

所以我尝试了下面的代码:

fetchRequest.predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (tType == %@) AND (NOT ANY tags IN %@)", argumentArray: [startDate, endDate, type.rawValue, tags])

fetchRequest.predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (tType == %@) AND (NOT tags IN %@)", argumentArray: [startDate, endDate, type.rawValue, tags])

但似乎两者都不起作用。它所做的只是返回所有项目,无论它们是否被标记。

我在这里错过了什么吗?

任何帮助,不胜感激。谢谢!

你试过这个吗?

let format = "(%@ <= date) AND (date < %@) AND (tType == %@) AND (NOT (tags IN %@))"
let args = [startDate as NSDate, endDate as NSDate, type.rawValue, tags]
let predicate = NSPredicate(format: format, argumentArray: args)

希望它应该有效!

为了那些遇到相同问题的人的利益,感谢@MartinR为我指出正确的方向。这是我想出的有效的谓词。

fetchRequest.predicate = NSPredicate(format: "(%@ <= date) AND (date < %@) AND (tType == %@) AND (SUBQUERY(tags, $t, $t IN %@).@count == 0)", argumentArray: [startDate, endDate, type.rawValue, exemptTag])

因此,关键成分是 SUBQUERY(tags, $t, $t in %@(.@count == 0,它本质上只是在被查询项的 tags 属性中搜索 exemptTag 中的值。

最新更新