0

2 つの NSDate プロパティを持つエンティティがあります。

@property NSDate *startTime;
@property NSDate *endTime;

ポイント イベントと期間イベントの作成に使用します。そのため、ポイント イベントendTimeは nil に等しくなる可能性があります。

そして、制限付きのすべてのエンティティを取得したい: startTime >= minDate && endTime <= maxDate

しかし、NSPredicate は次のようになります。

NSDate *startTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"firstBound"];
NSDate *endTime = [[NSUserDefaults standardUserDefaults] objectForKey:@"secondBound"];
[fetchRequest setPredicate:[NSPredicate predicateWithFormat:@"(startTime >= %@) AND ((endTime <= %@) OR (endTime == nil))",startTime,endTime]];

正しく動作しません。説明します。データベースに保存されているすべてのイベントが 2000 年から 2010 年の範囲にあり、minDate = 1900、maxDate = 1950 でフェッチを行っている場合、データベースからのポイント イベントはすべてこの述語に適合します。endTime フィールドが nil であるためです。フィールド startTime は明らかに minDate よりも大きくなっています。

これを処理する方法はありますか?NSPredicate によって制限されないでください。私はどんな決定にも近づきます。

4

2 に答える 2

0

私は同じ問題に直面していました。でも解決しました。コア データ自体は、NSDate を時間間隔形式で格納します。を述語のパラメーターとして渡すとNSDate、述語はそれを Time Interval に型キャストし、その比較を行います。私は同じことをしましたが、結果を返すことができませんでした。そのため、日付を時間間隔に明示的に変換することができます。

createdDate未満maxCreatedDateおよび未満のアイテムのリストを取得したかったminCreatedDate

私の問題では、次のように使用しました。

[NSPredicate predicateWithFormat:@"createdDate >= %f AND createdDate <= %f", [minCreatedDate timeIntervalSince1970], [maxCreatedDate timeIntervalSince1970]];

これは私にとってはうまくいきました。これを試すことができます:

[NSPredicate predicateWithFormat:@"(startTime >= %f) AND ((endTime <= %f) OR (endTime == nil))",[startTime timeIntervalSince1970], [endTime timeIntervalSince1970]];
于 2014-12-24T07:57:03.057 に答える