11

設定:

Bと多対多の関係を持つCoreDataオブジェクトAがあります。関係を「アイテム」と呼びます。したがって、a.itemsはAに関連付けられたすべてのBを返します。

これで、Bオブジェクトの手動で作成されたNSSet「itemSet」ができました。

私は次のことをしたい:

return all A objects whose "items" relation exactly matches itemSet

そのための述語を作成するにはどうすればよいですか?私はこれを試しました:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(ALL items in %@)", itemSet];

しかし、それは私に与えますUnsupported predicate (null)

これ:

NSPredicate *predicate = [NSPredicate predicateWithFormat:
                          @"(items in %@)", itemSet];

教えてくれunimplemented SQL generation for predicateます。興味深いですが、役に立ちません。

では、セットとの関係をフィルタリングする正しい方法は何ですか?

4

2 に答える 2

20

次の述語が機能します。

[NSPredicate predicateWithFormat:@"(items.@count == %d) AND (SUBQUERY(items, $x, $x IN %@).@count == %d)",
                      itemSet.count, itemSet, itemSet.count];

述語は、アイテムの数が指定された のサイズと等しいことを最初にitemSetチェックし、次に、メンバーであるアイテムの数itemSetも のサイズと等しいことをチェックしitemSetます。両方が真の場合、 はitemsと等しくなければなりませんitemSet

于 2012-10-26T11:46:44.353 に答える
0

やってみました:

NSPredicate *predicate = [NSPredicate predicateWithFormate:@"items == %@", itemSet];

または、より単純な述語を使用してサブセットを取り出し、フェッチ リクエストの外部でフィルタリングします。すなわち

  1. リレーションシップ内のアイテム数の述語を、比較セット内のアイテム数と同じになるように設定します。
  2. 結果を取得する
  3. これらの結果をフィルタリングして、セットに同じアイテムが含まれているものだけを表示します。
于 2012-10-26T10:27:22.837 に答える