NSPredicate使用核心数据实现双边对多关系?

时间:2013-05-24 19:07:51

标签: objective-c core-data many-to-many nspredicate relationship

我有一个Item实体和一个Wishlist实体。项目可以在多个愿望清单中,愿望清单可以包含多个项目。

使用列出所有愿望清单的WishlistTableViewController,我想选择一个并显示所选项目中的所有项目。我将Wishlist项发送给ItemTableViewController,但我仍然坚持创建谓词。

基本上,我想从给定的愿望清单中获取所有物品。

在SQL中,它将类似于:

SELECT * FROM Item WHERE WishlistItem.wishlist_id = wishlist.wishlist_id

(可能缺少内连接,这是一个非常粗略的草图,我多年没有编写SQL)

当然,当我们拥有多对多关系时,Core Data会自动创建该中间表,那么如何使用NSPredicate创建类似的谓词呢?我有我的获取结果控制器当前获取所有项目,没有谓词(它是nil)。如果用户不是来自某个心愿单,那么这是默认行为。

2 个答案:

答案 0 :(得分:1)

如果“wishlists”是从 Item Wishlist 的多对多关系,您可以使用 以下谓词用于获取与所选列表相关的所有项目:

WhishList *selectedWishList = ...;
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY wishlists == %@", selectedWishList];

答案 1 :(得分:1)

使用Core Data,您通常会建立多对多关系。 Item会有一个名为wishlists的多对多关系,Wishlist会有一个名为items的多对多关系,这些关系会相互颠倒。

通过这些关系,谓词是不必要的。如果你想获得愿望清单的所有物品,你只需要

Wishlist *wishlist = ... // passed in from WishlistTableViewController

NSSet *items = [wishlist valueForKey:@"items"];

或者,如果您有自定义NSManagedObject子类,则可以执行此操作:

NSSet *items = [wishlist items];