2012-10-09 5 views
2

교육 과정 및 관련 데이터의 일정을 추적하는 코어 데이터가있는 iOS 응용 프로그램에서 작업하고 있습니다. 내 모델 (SIMCourse)에는 startDateendDate의 두 속성이 있으며 NSDate 객체입니다. 여태까지는 그런대로 잘됐다.코어 데이터 - 중복되는 날짜 범위가있는 레코드 찾기

나는 동시에 두 과목을 예약하지 못하게하는 기능을 추가하려고합니다. 따라서 새로운 SIMCourse를 만들 때 해당 날짜 범위가 다른 기존 SIMCourse의 날짜 범위와 겹치는 지 확인하고 싶습니다. 즉, 새로운 코스가 1 월 1 일부터 3 월 3 일까지 진행되고 1 월 2 일부터 4 일까지 진행되는 기존 코스가있는 경우 분명히 충돌입니다.

데이터 저장소의 모든 SIMCourse 개체를 가져 와서 반복 할 수는 있지만 가장 좋은 방법이라고 확신하지는 않습니다. 누구든지 올바른 방향으로 나를 가리킬 수 있습니까?

+0

올바른 구문을 얻을 수있는 권한이 없지만 (endDate> newStartDate 및 startDate newEndDate) OR (startDate newEndDate)). 더 적은 번거 로움없이 내 머리 꼭대기에서 (endDate newEndDate)를 준수하지 않는 모든 객체를 선택할 수도 있지만 약간의 수정이 필요합니다. – Bergasms

+0

내 대답이 도움이 되었습니까? –

+0

마틴, 당신의 대답은 제가 필요한 것입니다. 정말 고맙습니다! – tammycravit

답변

7

(newStartDate, newEndDate)(startDate, endDate)

(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 
} 

여기서 두 코스는 끝날 때 겹칠 것이라고 가정했습니다. o f 한 코스는 다른 코스의 시작 날짜와 동일합니다. 그러한 간격이 "중첩"으로 간주되지 않으면 술어에서 <=<으로 Y \ 수 있습니다.

+0

이것은 대단히 도움이되었습니다 - 정말 고마워요! – tammycravit

관련 문제