次のモデル グラフがあります。
+-----------+ +-----------+
| Container | | Group |
+-----------+ +-----------+
| groups |<-->>| container |
+-----------+ +-----------+
^ ^
| |
+-----------+ +-----------+ +-----------+ +---------+
| Owner | | ToyBox | | ToyType | | Item |
+-----------+ +-----------+ +-----------+ +---------+
| toyBox |<--->| owner | | items |<-->>| toyType |
+-----------+ +-----------+ +-----------+ +---------+
UITableView では、アイテムのリストをリスト表示します。この場合、特定の所有者に属するアイテムのみを表示したいと考えています。これを行うには、NSFetchedResultsController を使用して項目を表示します。これは、NSFetchedResultsController に渡す適切な NSPredicate を使用して NSFetchRequest を作成する必要があることを意味します。
キーパス述語を使用しようとすると、親エンティティが原因で例外が発生します。これは、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 対 1 であるため、コレクションが返されないことがわかりました。これが問題です。だから私の質問は:
1) サブクエリで一対一の関係のコレクションを強制的に返す方法はありますか?
2)そうでない場合、フェッチリクエスト用にこの述語を作成する別の方法はありますか?