首页 文章

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

提问于
浏览
0

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

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

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

在SQL中,它将是这样的:

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

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

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

2 回答

  • 1

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

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

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

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

    Wishlist *wishlist = ... // passed in from WishlistTableViewController
    
    NSSet *items = [wishlist valueForKey:@"items"];
    

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

    NSSet *items = [wishlist items];
    

相关问题