14

私のコードであるコアデータ内のオブジェクトを見つけたい:

種類:

signedDate(日にち)

alarmDate(日にち)

starTime(NSD日付)

endTime(NSD日付)

NSString *str = @"(signedDate >= %@) AND (signedDate < %@) AND (alarmDate == nil)";
NSPredicate *predicate = [NSPredicate predicateWithFormat:str, starTime, endTime];
[request setPredicate:predicate];
NSArray *results=[context executeFetchRequest:request error:nil];

述語が間違っていますか?coredata オブジェクトが nil であると判断する方法は? 述語はどうあるべきですか?

4

2 に答える 2

23

述語構文が == nil を要求しているとは思わない。= を 1 つだけ使用する

NSString *str = @"(signedDate >= %@) AND (signedDate < %@) AND (alarmDate = nil)";

上記のコードは正しく機能します。nil なので YES である必要があります。

BOOL ok;
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
ok = [predicate evaluateWithObject:[NSDictionary dictionary]];

ok = [predicate evaluateWithObject:
[NSDictionary dictionaryWithObject:[NSNull null] forKey:@"firstName"]]; 
于 2012-04-20T12:39:02.173 に答える
10

アップルのドキュメントから

Null のテスト

null 値を照合する場合は、次のフラグメントに示すように、他の比較に加えて特定のテストを含める必要があります。

predicate = [NSPredicate predicateWithFormat:@"(firstName == %@) || (firstName = nil)", firstName];
filteredArray = [array filteredArrayUsingPredicate:predicate];
NSLog(@"filteredArray: %@", filteredArray);

// Output:
// filteredArray: ( { lastName = Turner; }, { birthday = 1972-03-23 20:45:32 -0800; firstName = Ben; lastName = Ballard; }

暗黙的に、null 値に一致する null のテストは true を返します。次のコード フラグメントでは、両方の述語評価で ok が YES に設定されています。

BOOL ok;
predicate = [NSPredicate predicateWithFormat:@"firstName = nil"];
ok = [predicate evaluateWithObject:[NSDictionary dictionary]];

ok = [predicate evaluateWithObject:
    [NSDictionary dictionaryWithObject:[NSNull null] forKey:@"firstName"]];
于 2012-04-20T12:13:27.087 に答える