2

トレーニングコースと関連データのスケジュールを追跡するコアデータを使用してiOSアプリケーションに取り組んでいます。私のモデル(SIMCourse)には、NSDateオブジェクトであるstartDateendDateの2つの属性があります。ここまでは順調ですね。

現在、2つのコースを同時にスケジュールしないようにする機能の追加に取り組んでいます。したがって、新しいSIMCourseを作成するときに、その日付範囲が他の既存のSIMCourseの日付範囲と重複していないかどうかを確認したいと思います。つまり、新しいコースが1月1日から3日まで実行され、既存のコースが1月2日から4日まで実行される場合、それは明らかに矛盾です。

データストア内のすべてのSIMCourseオブジェクトをフェッチして反復処理できることはわかっていますが、これが最善の方法であるとはまったく確信していません。誰かが私を正しい方向に向けるのを手伝ってもらえますか?

4

1 に答える 1

8

(newStartDate, newEndDate)(startDate, endDate)ifと重複します

(newStartDate <= endDate) && (startDate <= newEndDate)

(これは@Bergasmsが提案したものとほぼ同じですが、正確ではありません。ここで間違っている場合は、クレジットを彼に渡す必要があります。)

次のフェッチリクエストを使用して、重複するコースをチェックできます。

NSDate *newStartDate = ...;
NSDate *newEndDate = ...;

NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"SIMCourse"];
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"(%@ <= endDate) AND (startDate <= %@)",
                                      newStartDate, newEndDate];
request.predicate = predicate;
NSArray *results = [context executeFetchRequest:request error:&error];
if (error == nil) {
    // handle error
} else if (results.count == 0) {
    // no overlapping entries
} else {
    //overlapping entries in results array
}

ここでは、一方のコースの終了日がもう一方のコースの開始日と等しい場合、2つのコースが重複していると想定しています。<=そのような間隔が「重複」と見なされない場合は<、述語で置き換えることができます。

于 2012-10-09T16:54:04.193 に答える