我有两个简单的实体:

Part {
    @NSManaged var states: Set<PartState>
}

PartState {
    @NSManaged var date: Date
    @NSManaged var state: Int
}


我想从Part获取那些实体,最新的PartState具有state == 1

我尝试创建NSPredicate


NSPredicate(format: "SUBQUERY(states, $s, $s.date == max($s.date) AND $s.state == 1).@count > 0")

看起来max($.date)检查所有现有的PartState实体,而不仅仅是检查属于给定Part的实体,并且总是返回1或0结果。
NSPredicate(format: "ANY (states.state == 1 AND states.date == [email protected])")

失败:Unable to parse the format string...
NSPredicate(format: "ANY states.state == 1 AND ANY states.date == [email protected]")

返回状态为== 1(这是我期望的)的所有实体。


我想到的唯一其他解决方案是在Part中拥有newestState属性,但我仍在寻找一些基于NSPredicate的方式。

最佳答案

您可以使用排序描述符根据日期获取最新条目
并将谓词应用于状态== 1的提取

let fetchRequest = NSFetchRequest<Part>.init(entityName: "Part")
fetchRequest.sortDescriptors = [NSSortDescriptor.init(key: "states.date", ascending: false)]

 let predicate = NSPredicate.init(format: "states.state = %@","1")

关于ios - 核心数据谓词基于关系的两个属性进行提取,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/44948778/

10-11 19:46