Core data 核心数据:扩展谓词以获取具有特殊属性值的相关实体

Core data 核心数据:扩展谓词以获取具有特殊属性值的相关实体,core-data,swift,nspredicate,Core Data,Swift,Nspredicate,我有两个实体(1到多个),都有一个布尔标志“可见” 要获取一个文件的所有可见实体,我使用 request.predicate = NSPredicate(format:"visible != false") 通过这种方式,我得到了所有可见的A和所有的B(包括不可见的) 问题:是否可以扩展谓词以获取所有可见的A,其中只填充了B的所有可见实体? 或者我必须在所有实体中循环 谢谢 [Update 1]以下是一些代码: class A: NSManagedObject { @NSManaged

我有两个实体(1到多个),都有一个布尔标志“可见”

要获取一个文件的所有可见实体,我使用

request.predicate = NSPredicate(format:"visible != false")
通过这种方式,我得到了所有可见的A和所有的B(包括不可见的)

问题:是否可以扩展谓词以获取所有可见的A,其中只填充了B的所有可见实体? 或者我必须在所有实体中循环

谢谢

[Update 1]以下是一些代码:

class A: NSManagedObject {
    @NSManaged var visible: NSNumber
    @NSManaged var relationShipToB: NSSet
}
class B: NSManagedObject {
    @NSManaged var visible: NSNumber
    @NSManaged var relationShipToA: NSManagedObject
}
[Update 2]这就是我的解决方案(在Swift中)的样子

[更新3] 假设我们有以下实例:

A1 {
    visible = "true"
    toB = [B1, B2]
}

A2 {
    visible = "true"
    toB = [B3]
}

B1 {
    visible = "true"
}

B2 {
    visible = "false"
}

B3 {
    visible = "false"
}
预期结果:

A1 [B1]
A2 []
根据我的请求,我希望得到A1和A2(两者都是可见的)。 但是作为一个包含A1.toB的对象,我想要B1(B2不可见)
A2.toB将是emty,因为B3不可见。

您可以尝试以下代码

request.predicate = NSPredicate(format:"visible != false && ANY toB.visible != false")
。。。其中,
toB
是A和B之间一对多关系的名称

编辑

使用NSExpression子查询表达式(),可以编写与前面谓词等价的语句,如下所示:

fetchRequest.predicate = NSPredicate(format: "visible != false && (SUBQUERY(toB, $x, $x.visible != false).@count != 0)")
这两个谓词将允许您查找至少有一个与B managedObject相关的可见A文件

如果要获取仅具有可见相关B ManagedObject的ManagedObject,可以使用@Shmidt提供给我们的谓词:

request.predicate = NSPredicate(format:"visible != false && ALL toB.visible != false")
但问题是基于SQLite(NSSQLiteStoreType持久存储类型)的核心数据项目不能使用包含“ALL”的谓词:它会生成一个编译时错误,就像您得到的那样()

幸运的是,再次使用NSExpression子查询表达式,您可以编写一个(难看的)与前面的谓词等效的谓词,该谓词将适用于基于SQLite的核心数据项目:

fetchRequest.predicate = NSPredicate(format: "visible != false && (SUBQUERY(toB, $x, $x.visible != false).@count == toB.@count)")

请用A类和B类代码更新帖子。这是可能的,你应该使用所有操作符。由于缺少代码,目前很难给您现成的答案。如果解决方法解决了这个问题,请将其作为答案发布并接受!谢谢,但这不起作用,因为这是一对多的关系。出现以下错误:“由于未捕获的异常“NSInvalidArgumentException”终止应用程序,原因:“此处不允许使用多个键”编辑了我的答案:我忘记了谓词中的“ANY”。有关更完整的答案,请参阅我的编辑#2。哇,现在它变得复杂了:-),但我认为,我仍然想要一些不同的东西。请参阅我的更新后的问题当您执行fetchRequest(使用任何谓词)时,此请求的结果是相同类型的ManagedObject的NSArray。因此,如果您对managedObjects执行fetchRequest,此fetchRequest的结果将是managedObjects的NSArray(而不是混合a和B managedObjects的数组)。如果您想让所有B可见对象都具有可见的toA关系,则必须对B实体执行fetchRequest。让我知道,这也不行。我不能使用ALL运算符(不知道确切原因)。出现以下错误:“由于未捕获的异常“NSInvalidArgumentException”而终止应用程序,原因:“不支持的谓词可见==1,所有toB.visible==1'”相同错误。单个等号将更改为双等号。此外,给定参数“true”或“yes”会自动更改为“1”。
fetchRequest.predicate = NSPredicate(format: "visible != false && (SUBQUERY(toB, $x, $x.visible != false).@count == toB.@count)")
request.predicate = NSPredicate(format:"visible = true AND ALL relationShipToB.visible = true")