2011-09-05 2 views
1

각각 UITableView를 포함하는보기가 2 개 있습니다. 그것들은 iPad에서 나란히 동시에 표시됩니다.NSFetchedResultsController를 사용하여 엔티티의 관계를 기반으로 결과를 가져올 수 있습니까?

모든 데이터에 핵심 데이터를 사용하고 있습니다. 두 테이블을 편집 (행 추가, 삭제 등)해야하므로 각 뷰에서 NSFetchedResultsController를 사용하여이 모든 것을 처리해야합니다.

두 번째 테이블의 내용은 첫 번째 테이블에서 선택한 내용에 따라 다릅니다. 따라서 첫 번째 테이블에서 항목을 선택하면 해당 개체가 두 번째 테이블이있는보기로 전달되므로 (두 번째 테이블로 이동해야하는 데이터에 대한 액세스 권한이 이미 있음) 사용하려고합니다. 가능한 경우 NSFRC의 모든 내장 처리.

모델은 대학 (uniID, uniName, students) 및 학생 (stuID, stuName, university)의 행을 따릅니다. 그래서 관계는 다음과 같습니다 : University < - >> 학생.

나는 NSFRC에 다음 코드를 사용하고 있지만, 0 결과를 반환하는 것 :

- (NSFetchedResultsController *)fetchedResultsController { 

if (fetchedResultsController != nil) { 
    return fetchedResultsController; 
} 

NSManagedObjectContext *context = appDelegate.managedObjectContext; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sort = [[NSSortDescriptor alloc]initWithKey:@"stuName" ascending:YES]; 
[fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]]; 

[fetchRequest setFetchBatchSize:20]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"university == %@",self.selectedUniversity]; 
[fetchRequest setPredicate:predicate]; 

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 

self.fetchedResultsController = theFetchedResultsController; 
fetchedResultsController.delegate = self; 

[sort release]; 
[fetchRequest release]; 
[theFetchedResultsController release]; 

return fetchedResultsController;  

}

사람이 적어도 올바른 방향으로 날 지점 수 있다면 가장 감사하게 될 것입니다. ..

답변

0

그래서이 문제를 해결했다. (위의 코드를 제거하여 NSFRC은이 호출 할 때마다 다시 갖는

if (fetchedResultsController != nil) { 
    return fetchedResultsController; 
} 

: 술어의 용어는 물론, (즉,이 대학을 선택했다) 변경해야 할 때 NSFRC 때문에의 업데이트되지 않는 한)은 생성 된 후 가져 오기가 실행되어야하기 때문에 numberOfRowsInSection이 호출되기 직전에 발생할 수 없으므로 (이 메서드가 NSFRC를 호출하고 다시 작성하므로) 작동하지 않습니다.

그래서 새 University가 선택 될 때마다 YES로 설정된 newFetchRequired라는 뷰에 BOOL을 추가했습니다. 페치

if (fetchedResultsController != nil && !newFetchRequired) { 
     return fetchedResultsController; 
    } 
newFetchRequired = NO; 

이 제대로 수행 (호출하는과 NSFRC을 재현) 다음입니다 :

[self.fetchedResultsController performFetch:&error]; 

을 나는이 비슷한 상황에있는 사람을 도움이 희망 NSFRC에서, 위의 코드를 변경해야 .

Ashley에게 감사의 말을 전합니다.

0

performFetch:으로 기억 나니?

확인 즉

NSError *error; 
BOOL success = [fetchedResultsController performFetch:&error]; 
+0

감사합니다. Ashley. 예, 가져 오기를 수행하고 있지만 numberOfRowsInSection에 반환 된 행 수는 0입니다. –

+0

fetchRequest에 예상하는 내용이 포함되어 있는지 확인할 수 있습니다 (여기에 게시 하시겠습니까?) –

+0

가져 오기 요청은 검색어가 무. (엔티티 : 학생, 술어 : (대학 == nil), sortDescriptors : ( "(stuName, 오름차순, 비교 :)" )), 일괄 처리 크기 : 20, 형식 : NSManagedObjectResultType; 대학은 NSFRC가 만들어지면 무효입니다. 선택한 대학을 사용하도록 업데이트하려면 어떻게해야합니까? –

0

나는 아직도 당신이 이것을 확인하고 있는지 모르겠다. 나는 당신의 질문을 정확하게 이해했는지 확신 할 수 없다. 그러나 단지 당신이 술어를 바꾸고 싶을 때 처음부터 NSFRC를 만드는 이유는 무엇인가?

NSFetchRequest *fetchRequest = [self.fetchedResultsController fetchRequest]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"university == %@",self.selectedUniversity]; 

[fetchRequest setPredicate:predicate]; 

NSError *error; 
[fetchedResultsController performFetch:&error]; 

하면됩니다 : 새로운 대학을 선택

바로 거기에 코드를 추가 : 여기에 내가 그것을 할 것입니다 방법입니다. (미안하면 이것이 당신이 찾고 있던 것이 전부가 아닙니다.)

편집 : 또한 이것을 개인 기능에 쓰고 대학을 선택할 때마다 호출 할 수도 있습니다.

관련 문제