【问题标题】:Core Data with to Many relationship - Creating a NSPredicate with ALL in SUBQUERY具有多对多关系的核心数据 - 在 SUBQUERY 中使用 ALL 创建 NSPredicate
【发布时间】:2011-07-22 23:27:20
【问题描述】:

我的对象图是这样的

SnapShot -->> 窗格 --> ManagedImage

我正在尝试找到一个 SnapShot,其中包含的确切 ManagedImages 包含在集合中。

我现在得到的代码返回一个快照数组,其中包含一个或多个集合中的 ManagedImage。然后我在数组中搜索以找到正确的快照,但我猜在子查询中过滤会快得多

使用 NSPredicate 如何获得具有集合中所有 ManagedImages 的唯一 SnapShot?

这是我的代码

mySet = ... // A unique set of (usually 3) managedImages that I'm trying to find a snapShot for

NSFetchRequest *request = ...
request.entity = [NSEntityDescription entityForName:@"SnapShot" inManagedObjectContext:[self managedObjectContext]];

// Want this to work but sends an exception
//request.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(self.panes, $pane, ALL $pane.managedImage IN %@).@count != 0", mySet];

// Using this
request.predicate = [NSPredicate predicateWithFormat:@"SUBQUERY(self.panes, $pane, $pane.managedImage IN %@).@count != 0", mySet];

【问题讨论】:

    标签: ios core-data nspredicate


    【解决方案1】:

    一个好的经验法则是,如果您已经拥有托管对象,则无需获取而是将关系从您拥有的托管对象转移到您想要的托管对象。

    因此,您的关系图实际上可能如下所示:

    SnapShot <-->> Pane <--> ManagedImage
    

    或者也许:

    SnapShot <<-->> Pane <<--> ManagedImage
    

    由于您有一组ManagedImage 对象,您所要做的就是遍历pane.snapShotpanes.snapShots 的键路径以找到与每个ManagedImage 对象关联的SnapShot 对象。然后,您只需提取唯一的 SnapShot 对象。

    第一种情况,因为是一对一的关系路径,所以事情是小事一桩

    ManagedImage-->Pane-->SnapShot
    

    在第二种情况下,您需要先获取所有唯一的 SnapShot 对象:

    NSSet *shots=[aMangedImageObj valueForKeyPath:@"distinctUnionOfSets.panes.snapShots"];
    

    ...对于每个ManagedImage 实例,然后将所有集合与setByAddingObjectsFromSet: 或类似方法合并以生成一组唯一对象。

    Fetches 应该用于在图中找到您需要的第一个对象,但是一旦您拥有这些对象,您就不会获取而是遍历关系。否则,首先建立关系没有多大意义。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2011-02-18
      • 1970-01-01
      • 1970-01-01
      • 2012-03-08
      • 1970-01-01
      • 2011-02-01
      • 1970-01-01
      • 2014-01-16
      相关资源
      最近更新 更多