web-dev-qa-db-ja.com

NSildicateを設定して、nil属性を持つオブジェクトを探す方法

私はManagedObject class、およびクラスのメンバーの1つはNSDateです。日付が設定されていないクラスのすべてのオブジェクトを表示したいと思います。私はこのような述語を使用してみました:

NSPredicate *predicate = [NSPredicate predicateWithFormat: @"(date = NIL)"];

しかし、dateが設定されているオブジェクトはまだ取得できます。このための述語を設定する正しい方法は何ですか?

50
mezulu

これは大文字と小文字の区別の問題だと思います。 「nil」または「NULL」を使用できますが、「NIL」は使用できません。これは私にとってはうまくいきます:

NSPredicate *eventWithNoEndDate = [NSPredicate predicateWithFormat:@"endDate = nil"];
100

理解した。文字列形式の述語を使用してそれを行うことができなかったため、テンプレートを使用して述語を試してみましたが、うまくいきました。これは、endDateがNULLに設定されたオブジェクトを提供したコードです。

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"endDate = $DATE"];
predicate = [predicate predicateWithSubstitutionVariables:
                   [NSDictionary  dictionaryWithObject:[NSNull null] forKey: @"DATE"]];
10
mezulu

https://developer.Apple.com/library/mac/documentation/Cocoa/Conceptual/Predicates/Articles/pUsing.html#//Apple_ref/doc/uid/TP40001794-SW4

次のコードが動作するはずです

predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
3
Jerry Juang

Appleによって文書化されているように、フェッチリクエストには非常に迷惑な動作があります。

コンテキスト内のオブジェクトが変更されている場合、述語は永続ストア内の現在の状態ではなく、変更された状態に対して評価されます。したがって、コンテキスト内のオブジェクトがフェッチリクエストの基準を満たすように変更された場合、ストアに変更が保存されておらず、ストア内の値が基準を満たさない場合でも、リクエストはそれを取得します。逆に、コンテキスト内のオブジェクトがフェッチ要求と一致しないように変更されている場合、ストア内のバージョンが一致してもフェッチ要求はそれを取得しません。

他の場所で日付をクリアしている可能性があり、フェッチリクエストには日付がメモリ内ではnilであるがディスク上(永続ストア内)に設定されている結果が含まれているため、オブジェクトに障害が発生するとオブジェクトが読み込まれます日付が設定されています。

私の唯一のアドバイスは、フェッチ要求を実行する前に更新を永続ストアに保存できるように、管理オブジェクトコンテキスト(たとえば、NSOperationQueue)へのアクセスを調整することです。

0
Frank Schmitt