我有以下模型图:
+-----------+ +-----------+
| Container | | Group |
+-----------+ +-----------+
| groups |<-->>| container |
+-----------+ +-----------+
^ ^
| |
+-----------+ +-----------+ +-----------+ +---------+
| Owner | | ToyBox | | ToyType | | Item |
+-----------+ +-----------+ +-----------+ +---------+
| toyBox |<--->| owner | | items |<-->>| toyType |
+-----------+ +-----------+ +-----------+ +---------+
在 UITableView 中,我要显示一个项目列表。在这种情况下,我只想显示属于特定所有者的项目。为此,我将使用 NSFetchedResultsController 来显示项目。这意味着我需要创建一个带有适当 NSPredicate 的 NSFetchRequest 以提供给 NSFetchedResultsController。
由于父实体,尝试使用 keypath 谓词会导致异常。这似乎是 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)如果没有,还有另一种方法可以为获取请求创建这个谓词吗?