0

次の構造のモデルがあります。

  • ドキュメントエンティティには多くのコマンドがあります
  • コマンドはドキュメントに属しています

  • ドキュメントには多くのタグがあります

  • タグには多くのドキュメントがあります

このタイプの関係には追加のテーブルが使用されるため、これは重要です。

タグには、列挙型である整数であるtypeプロパティもあります。

私が達成しようとしているのは、明らかに単一のクエリで、TagTypeUnwantedタイプのタグとの関係を持たないドキュメントに属するコマンドをCoreDataに要求することです:)

述語を使用してサブクエリを作成しようとしました:

[NSPredicate predicateWithFormat:@"SUBQUERY(document.tags, $tag, $tag.type == %d).@count == 0", TagTypeUnwanted]

残念ながら、ドキュメントとタグの関係を管理するミドルテーブルに参加しようとします。そのため、ドキュメントIDとタグIDしかなく、これは私が期待したものではないため、そこにファイルされた「タイプ」が見つからないという不満が生じます。多対多以外のすべての関係で機能するように見えますが、この場合は失われます。

[NSPredicate predicateWithFormat:@"NOT ANY document.tags.type == %d", TagTypeUnwanted]

これも、SQLにNOTのみを残し、多くのタイプのタグとの関係のために、検出されたすべてのドキュメントで再起動するため、機能しません。したがって、タイプがTagTypeUnwantedタイプではないレコードを常に少なくとも1つ検出します。

詳細情報や生成されたSQLなどが必要な場合は、コメントに書き込んでください。前もって感謝します!


2007年以降の既知の問題であることが確認できた限り、NOT ANYとNONEの両方がコアデータで機能していないようです。通常、これを回避するためにサブクエリを実行しますが、この場合のサブクエリは多くを処理できないようです-多対多のテーブル

NOT ANYは次を生成します:AND NOT(Tag.type == TagTypeUnwanted)なので、SQLが実際にどのように見えるかだけに近いです

4

1 に答える 1

1

これはおそらくあまり効果的ではありませんが、次のネストされたSUBQUERYが機能しているように見えるのは興味深いかもしれません。

[NSPredicate predicateWithFormat:
    @"SUBQUERY(document, $doc, SUBQUERY($doc.tags, $tag, $tag.type == %d).@count == 0) != NULL",
    TagTypeUnwanted]
于 2012-11-26T18:57:36.400 に答える