42

Task エンティティにオプションの多対多のリレーションシップ excludeOccurrences が含まれる Core Data モデルがあります。excludeOccurrences のプロパティの 1 つは start で、これは NSDate オブジェクトです。ExcludedOccurrence エンティティには、Task エンティティと逆の必須の対 1 関係があります。

指定した日のタスクを取得するには、指定した日が ExcludedOccurrence エンティティの開始プロパティとして表示されないようにする必要があります。したがって、私が使用しようとしているサブ述語の1つは

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(ALL excludedOccurrences.start != %@))", today];

ここで、today は、日、月、年のコンポーネントのみを含む今日の NSDate オブジェクトです。除外されたすべての開始プロパティには、日、月、および年のコンポーネントのみが含まれます。

これで問題ないはずですが、少なくとも Core Data と NSPredicate のドキュメントを読むと、次のエラー メッセージが表示されます。

キャッチされていない例外 'NSInvalidArgumentException' が原因でアプリを終了しています。理由: 'サポートされていない述語

同等の述語を使用する場合

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"!(ANY excludedOccurrences.start == %@))", today];

例外はスローされませんが、コードは期待どおりに機能しません。除外すべきではない今日のオカレンスが除外されます。

また、excludedOccurrences == nil の場合をテストする方法もわかりません: 次の述語

NSPredicate *nilPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences == nil)"];

実行時に例外を引き起こす

対多キーはここでは許可されていません

ただし、excludedOccurrences 関係はオプションであるため、nil かどうかもテストする必要があります。

どうすればこれに対処できますか? 前もって感謝します。

4

4 に答える 4

112

空の関係をテストするには、to-many キーのカウントを 0 と比較する必要があります。

[NSPredicate predicateWithFormat:@"excludedOccurrences.@count == 0"];

副述語に関しては、述語全体でその修飾子を複数回使用できますが、最後の述語にはALLor修飾子のいずれかのみを含めることができることに注意してください。ANY

ダメANY foo.bar = 1 AND ALL foo.baz = 2
OK: ANY foo.bar = 1 AND !(ANY foo.baz != 2)

于 2009-07-28T17:21:22.727 に答える
28

皆さんの助けを借りて、私はついに私のシナリオの正しい述語を決定することができました。NSDateオブジェクトはdoubleとして処理されているように見えますが、doubleは3.7のようなものではなく、常に3.0のようなものです。したがって、次の述語は私のテストで正しく機能します。

NSPredicate *occurrenceIsNotExcludedPredicate = [NSPredicate predicateWithFormat: @"(excludedOccurrences.@count == 0 || (excludedOccurrences.@count > 0 && NONE excludedOccurrences.start == %@))",thisDate];

ここで、thisDateは、日、月、年のコンポーネントのみを含むNSDateオブジェクトです(ExcludedOccurrenceエンティティのstartプロパティの場合と同様)。

空の関係のテストは、Appleの一部の人々によって提案されているように、基本的に@count集計演算子を使用して行われます。

繰り返しになりますが、ご協力いただきありがとうございます。私はまだドキュメントにいくつかの部分で欠陥があることを観察しています(特に、ALLが正常に機能し、代わりにまったく機能しないと書かれている場合)。

于 2009-07-29T15:29:41.773 に答える
8

したがって、空でない関係をテストするには、これが実際に機能します。

[NSPredicate predicateWithFormat:@"relationship.@count != 0"]

アシュリー・クラークによって提供された解決策がクラッシュし、「ここでは許可されていない多対多のキー」が表示されます

于 2010-01-11T04:42:13.670 に答える
4

そしてSwift 2では、次のようなものです:

request.predicate = NSPredicate(format: " relationship.@count != 0")
于 2015-11-27T07:46:44.073 に答える