NSPredicate过滤关系

时间:2018-06-25 04:12:30

标签: ios core-data nspredicate

让我们假设我拥有“人”和“宠物”实体,并且具有一对多关系,因此“人”具有一个宠物列表。目前,我可以使用该谓词按宠物的年龄进行过滤(为方便起见,在Swift和Objective-C中)

NSPredicate(format: "pets.age > 3")
[NSPedicate predicateWithFormat:@"pets.age > 3"]

但这很不舒服,也不是很健壮-因为宠物实体可能会从许多其他实体(例如,医生,其他宠物兄弟姐妹,也许是宠物玩具等)中查询出来,只是出于您的想象力。

我想做什么:

NSPredicate(format: "pets MATCH %@", NSPredicate(format: "age > 3"))
[NSPedicate predicateWithFormat:@"pets MATCH %@", [NSPedicate predicateWithFormat:@"age > 3"]]

因此我可以让Pet实体给我正确的年龄谓词,然后在其他任何谓词中使用它。我该如何存档?我想在iOS设备上的CoreData上使用它,所以SQL查询CoreData脱离它非常重要,因为性能很重要。

2 个答案:

答案 0 :(得分:1)

您可以在谓词字符串中使用%K作为键路径占位符

NSPredicate(format: "%K > %@", "age", "3")

因此,根据您的需要,可以在创建谓词时使用一些带有不同运算符的常量

let greaterThanPredicate = "%K > %@"
let equalPredicate = "%K = %@"

等等,或者某种工厂类,如果您的要求更复杂。

答案 1 :(得分:0)

不确定我正确地获得了您想要的东西,但似乎子查询就是您所需要的。以here为例