核心数据获取请求谓词过滤

我有以下模型图:

                  +-----------+     +-----------+
                  | Container |     |   Group   |
                  +-----------+     +-----------+
                  |  groups   |<-->>| container |
                  +-----------+     +-----------+
                        ^                 ^
                        |                 |
+-----------+     +-----------+     +-----------+     +---------+
|   Owner   |     |  ToyBox   |     |  ToyType  |     |  Item   |
+-----------+     +-----------+     +-----------+     +---------+
|  toyBox   |<--->|   owner   |     |   items   |<-->>| toyType |
+-----------+     +-----------+     +-----------+     +---------+

在UITableView中,我将显示一个列表项目列表。 在这种情况下,我只想显示属于特定所有者的物品。 为此,我将使用NSFetchedResultsController来显示项目。 这意味着我需要创建一个NSFetchRequest和一个适当的NSPredicate以提供给NSFetchedResultsController。

尝试使用键路径谓词会导致由父实体引起的异常。 这似乎是Apple的错误或不支持的决定。 雷达已经提交。 另外,我不希望扁平化这些实体。

因此,我试图用SUBQUERY()来做到这一点,如下所示:

NSFetchRequest *itemsFetchRequest = [[NSFetchRequest alloc] initWithEntityName:@"Item"];
NSPredicate *itemsPredicate = [NSPredicate predicateWithFormat:@"SUBQUERY(toyItem, $g, SUBQUERY($g.container, $c, SUBQUERY($c.owner, $o, $o = %@).@count > 0).@count > 0).@count > 0", ownerObject];

这导致以下例外情况:

Can't have a non-relationship collection element in a subquerySUBQUERY($c.owner, $o, $o == <MLMOOwner: ...

我意识到,因为所有者和ToyBox之间的关系是一对一的,所以没有返回的集合,这是问题所在。 所以我的问题是:

1)有没有办法强制在子查询中返回一对一关系的集合?
2)如果没有,还有另外一种方法可以为获取请求创建谓词?


看起来应该是很简单的做你想做的事情。 如果您希望给定所有者的所有项目,请从所有者开始,并使用关键路径获取关联的项目。 你不需要谓词。 如果你有10罐花生,而你想用罐子2取出花生,那么你不是从一套花生开始,然后根据他们的罐子过滤它们,对吧? 你首先得到罐子2,然后你看看它包含的花生。 所以这样做:

NSSet *groups = [ownerObject valueForKeyPath:@"toyBox.groups"];

这给了ownerObject拥有的所有组。 您不能只使用单个关键路径获取所有项目,因为Group实体没有items属性。 即使只返回一个空集,您也可以通过给Group items访问器来让自己的生活更轻松。 那会让你这样做:

NSSet *items = [ownerObject valueForKeyPath:@"toyBox.groups.items"];

如果您不想将items属性添加到Group ,则必须从第一个示例中筛选出所设置的groups ,以挑选那些是ToyType对象的对象。 然后,您可以使用该集上的键路径@"items"来获取所需的项目列表。

你必须小心实体继承。 你刚才看到它是如何使得获取更复杂一点。 它也会影响数据的存储方式,即所有子实体的实例都存储在同一个表中。 因此,如果您有十几个从Group派生的实体(如ToyType ),则所有这些实体的所有实例都将一起存储。

链接地址: http://www.djcxy.com/p/60633.html

上一篇: Core Data fetch request predicate filtering across one

下一篇: NSPredicate compare with Integer