0

次のモデル グラフがあります。

                  +-----------+     +-----------+
                  | 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)そうでない場合、フェッチリクエスト用にこの述語を作成する別の方法はありますか?

4

1 に答える 1

2

あなたがやりたいことをするのはもっと簡単であるべきだと思われます。特定の所有者を持つすべてのアイテムが必要な場合は、所有者から始めて、キー パスを使用して関連するアイテムを取得します。述語は必要ありません。ピーナッツの瓶が 10 個あり、瓶 2 のピーナッツを取得したい場合、すべてのピーナッツのセットから始めて、瓶に従ってそれらをフィルター処理するのではありませんよね? 最初に jar 2 を取得し、次に含まれているピーナッツを調べます。だからこれをしてください:

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

これにより、 が所有するすべてのグループが得られますownerObject。エンティティには属性Groupがないため、単一のキー パスを使用してすべてのアイテムを取得することはできません。空のセットしか返さない場合でも、アクセサーを提供することで、items自分の生活を楽にすることができます。これにより、次のことが可能になります。Groupitems

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

itemsに属性を追加したくない場合は、最初の例Groupのセットをフィルタリングして、groupsToyType オブジェクトであるオブジェクトだけを選択する必要があります。次に、そのセットのキー パス@"items"を使用して、必要なアイテムのリストを取得できます。

エンティティの継承には少し注意する必要があります。これにより、フェッチが少し複雑になることがわかりました。また、データの保存方法にも影響があります。つまり、サブエンティティのすべてのインスタンスが同じテーブルに保存されます。したがって、Group( などToyType) から派生した多数のエンティティがある場合、それらすべてのエンティティのすべてのインスタンスがまとめて格納されます。

于 2012-08-26T20:05:47.280 に答える