使用反向方式过滤核心数据

Filtering core data using the reverse way

我有一个名为 eventTimes 的 属性 核心数据实体。

eventTimes 是一个字符串 属性,它可以为空或包含如下四个示例中的值。

现在我需要根据时间值使用 NSPredicate 过滤它。它需要 NSPredicate 因为它将与 CoreData 的 NSFetchController 和 SwiftUI 一起使用。

示例:给我包含 14:00.

的条目

我需要使用类似

的东西
NSPredicate(format: "eventTimes IN %@", array )

但我的情况恰恰相反,即eventTimes是数组,对象是另一个元素。

类似

NSPredicate(format: "%@ IN eventTimes", oneTime )

但如果我这样做,它就会崩溃。

有什么办法吗?

eventTimes 不是数组,即使你希望它是。这是一个字符串,您的谓词因此而崩溃。

您可以使用复合谓词针对以下字符串组成查询:

NSPredicate(format: "eventTimes CONTAINS %@", timeString )

并形成一个数组传递给

NSCompoundPredicate(orPredicateWithSubpredicates:)

但这很快就会变得混乱,所以你最好正确地做这件事并形成一个 EventTime 实体,它与 Event(或者你称之为相关实体)。

这种方法允许您形成复杂的基于时间的搜索,例如“查找 12:00 之前开始的所有事件”,而无需使用魔术字符串格式。