2014-09-02 2 views
0

그림에 그림과 같이 두 개의 엔티티가 있습니다. 특정 약속 및 참석자가 삭제되지 않은 모든 관련 참석자를 가져와야합니다 (hasDeleted! = 1). 나는 다른 술어 형식으로 시도했다. 다음은 내가 시도한 두 가지 주요 술어이며이 술어를 사용할 수 없다. 이 문제를 극복하기 위해 나를 도울 수 있습니까?iOS 1 대 다수를위한 핵심 데이터 술어

NSPredicate *predicate1 = [NSPredicate predicateWithFormat:@"objectName = %@ AND objectId = %i AND SUBQUERY(attendees, $x, $x.hasDeleted != 1)[email protected] != 0", [self.userDefaults stringForKey:OBJECT_NAME], [[self.userDefaults objectForKey:OBJECT_ID] intValue]]; 
NSPredicate *predicate2 = [NSPredicate predicateWithFormat:@"objectName = %@ AND objectId = %i AND (ANY attendees.hasDeleted != 1)", [self.userDefaults stringForKey:OBJECT_NAME], [[self.userDefaults objectForKey:OBJECT_ID] intValue]]; 

Appointment and Attendee entities

약속 목록의 tableview 참석자 세부 사항을 볼 수 있습니다

enter image description here

상세 약속보기. enter image description here

는 결과 컨트롤러 코드를 가져 오기 :

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Attendee" inManagedObjectContext:self.managedObjectContext]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"uuid" ascending:NO]; 
    NSArray *sortDescriptors = @[sortDescriptor]; 

    [fetchRequest setSortDescriptors:sortDescriptors]; 

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"appointment.objectName = %@ AND appointment.objectId = %i AND hasDeleted != 1", [self.userDefaults stringForKey:OBJECT_NAME], [[self.userDefaults objectForKey:OBJECT_ID] intValue]]; 

    [fetchRequest setPredicate:predicate]; 

    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.managedObjectContext sectionNameKeyPath:nil cacheName:nil]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    NSError *error = nil; 
    if (![self.fetchedResultsController performFetch:&error]) { 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
     abort(); 
    } 
    return _fetchedResultsController; 
} 
+0

당신이 오류는 콘솔에 로그인 한 마을 추가하려면? "objectId = % i"를 "objectId = % @"로 변경하고 거기에 NSNumber 객체를 전달할 수 있습니다 (그러면 int로 변환 할 필요가 없습니다). 하위 쿼리가 필요하지 않습니다. 두 번째 쿼리가 작동해야합니다. –

+0

술어를 "하나씩"사용해 보았습니까? 내 말은, 모든 and/or/subquery를 나누고, 하나씩 그것이 원하는 것을 얻는지를 보아라. 그런 다음 조금씩 조합하십시오. – Larme

+0

@thom_ek 오류가 없습니다. 두 번째 이벤트를 필터링하지 않고 모든 참석자를 반환합니다. – Chinthaka

답변

1

A는 요청이 항상 관리 개체 컨텍스트에서 개체를 반환 가져옵니다. 수 없습니다 특정 속성 가진 참석자가 포함 된 "참석자"수정 된 관계가있는 약속 개체 같은 "수정 된 개체"를 가져옵니다.

대신 수행 할 수있는 것은 삭제 된 참석자 개체를 가져오고 대신 지정된 약속과 관련된 개체를 가져 오는 것입니다. 새로운 정보에 따라 조건

[NSPredicate predicateWithFormat:@"appointment.objectName = %@ AND appointment.objectId = %i AND hasDeleted != 1", [self.userDefaults stringForKey:OBJECT_NAME], [[self.userDefaults objectForKey:OBJECT_ID] intValue]] 

업데이트을 상기 참석자 실체에 대한 요청을 가져오고 사용 만들기 : 첫 번째 뷰 컨트롤러에서 당신이에 대한 가져 오기 요청이있는 가져온 결과 컨트롤러를 사용 약속 엔티티. 당신이 을 취소하지 않은 참석자가있는 경우에만 약속을 표시 할 경우,이 인출 요청에 술어

[NSPredicate predicateWithFormat:"ANY attendees.hasDeleted != 1"] 

를 추가합니다.

사용자가 약속을 탭하면 다음 약속보기에 컨트롤러로 전달합니다. 참석자 엔터티에 대한 가져 오기 요청이있는 가져온 결과 컨트롤러를 사용,이 약속 참석자를 표시하고 술어

[NSPredicate predicateWithFormat:@"appointment = %@ AND hasDeleted != 1", selectedAppointment] 
+0

여기에서 개체를 수정하고 있습니까? 우리는 단지 "참석자"를 제한합니다. 귀하의 솔루션이 작동합니다. 그러나이 출석자는 각 참석자에게 중복 된 약속 참조를 반환합니다. – Chinthaka

+0

@Chinthaka : 개체가 수정되지 않았습니다. 마지막 발언을 완전히 이해하지 못합니다. 귀하의 질문을 이해하기 때문에, 모든 가져온 참석자 개체는 동일한 * 약속 (술어에 지정된)과 관련되어야합니다. –

+0

먼저 약속을 가져온 다음 참석자를 위해 별도의 가져 오기를 수행해야한다고 말하고 있습니까? 한 번에이 작업을 수행 할 수있는 방법이 있습니까? NSFetchedResultsController를 사용하여이 약속을 테이블 뷰에 채울 것이기 때문입니다. – Chinthaka

관련 문제