我有一个Item
实体和一个Wishlist
实体。项目可以在多个愿望清单中,愿望清单可以包含多个项目。
使用列出所有愿望清单的WishlistTableViewController
,我想选择一个并显示所选项目中的所有项目。我将Wishlist
项发送给ItemTableViewController
,但我仍然坚持创建谓词。
基本上,我想从给定的愿望清单中获取所有物品。
在SQL中,它将类似于:
SELECT *
FROM Item
WHERE WishlistItem.wishlist_id = wishlist.wishlist_id
(可能缺少内连接,这是一个非常粗略的草图,我多年没有编写SQL)
当然,当我们拥有多对多关系时,Core Data会自动创建该中间表,那么如何使用NSPredicate
创建类似的谓词呢?我有我的获取结果控制器当前获取所有项目,没有谓词(它是nil
)。如果用户不是来自某个心愿单,那么这是默认行为。
答案 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];