Core Data 多对多谓词(再次)

Posted

技术标签:

【中文标题】Core Data 多对多谓词(再次)【英文标题】:Core Data many-to-many predicate (again) 【发布时间】:2013-10-04 03:59:56 【问题描述】:

昨天我asked a question关于多对多关系:

我有两个通过多对多关系关联的实体:

Database <<----->> Category

换句话说,一个数据库可以有很多类别,一个类别可以 与许多数据库相关联。

我需要一个 NSPredicate 来返回所有相关的 Category 对象 使用给定的数据库对象。

...并收到了一些非常有用的建议。我现在想问一个不同但相关的问题:

我想要一个 NSPredicate,它将返回所有与给定数据库对象无关的 Category 对象。

我需要它作为谓词,因为它被用作获取结果控制器的一部分。

非常感谢任何帮助。提前致谢!

【问题讨论】:

如果你不能解决这个问题,是否有改变数据模型的空间? 数据模型本身设计得很好,也很有意义,所以我希望有办法解决这个要求——理论上似乎没有那么复杂? NSPredicate *predicate = [NSPredicate predicateWithFormat:@"parent != %@", self.parent];这不工作嘿?? 不,它不是,因为它是一对多的关系 - 不是一对一的关系:*** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'to-many key not allowed here' 【参考方案1】:

“NOT ANY”查询无法正常工作似乎是核心数据错误 (有关类似问题,请参阅 Core Data NSPredicate with to-Many Relationship)。

作为一种解决方法,您可以将以下谓词与“SUBQUERY”一起使用:

[NSPredicate predicateWithFormat:@"SUBQUERY(databases, $db, $db == %@).@count == 0", theDatabase]

【讨论】:

效果很好。感谢您指出错误并提供解决方法。【参考方案2】:

尝试使用:

[NSPredicate predicateWithFormat:@"NOT (ANY databases = %@)", database];

或者

[NSPredicate predicateWithFormat:@"NOT(%@ IN databases)", database]

【讨论】:

不幸的是,这不起作用 - 它什么也不返回(我知道有些类别与它应该返回的数据库无关)。 很抱歉还是不行 - 两者都没有返回任何对象。

以上是关于Core Data 多对多谓词(再次)的主要内容,如果未能解决你的问题,请参考以下文章

JPA CriteriaQuery 多对多谓词

使用 Swift 和 Core Data 的多对多附加数据

RestKit 与 Core Data 多对多:它有效,但我做得对吗?

Core Data + RestKit 映射多对多关系?

在“多对多关系”环境中将图片保存在 Core Data 中

如何有效地迭代 NSSet (Objective-C) - Core Data 中的多对多关系表示?