繁体   English   中英

核心数据获取跨一对一关系的请求谓词过滤

[英]Core Data fetch request predicate filtering across one-to-one relationship

我有以下模型图:

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

在UITableView中,我将显示一个列表项目。 在这种情况下,我只想显示属于特定所有者的项目。 为此,我将使用NSFetchedResultsController来显示项目。 这意味着我需要创建一个带有适当NSPredicate的NSFetchRequest来提供给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: ...

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

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

似乎做你想做的事要简单得多。 如果您想要具有给定所有者的所有项目,请从所有者开始并使用关键路径获取关联项目。 您不需要谓词。 如果你有10罐花生,你想在罐子里找回花生,你不要从所有花生开始,然后根据罐子过滤它们,对吧? 你首先得到罐子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 ),则所有这些实体的所有实例都存储在一起。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM