2013-06-03 4 views
0

최근에 CoreData를 사용하기 시작했는데 알아 내지 못했던 복잡한 (적어도 나에게) 페치가 발생했습니다. 나는 주변을 수색했지만 좋은 용어로 검색하는 데 어려움을 겪었으므로 만족스러운 결과를 얻지 못했다. 여기 내 coredata 모델의 기본 예입니다 : 내가 뭘하려고 오전양방향 다 대 관계에 대한 NSFetchRequest

enter image description here

은 특정 클럽의 멤버 인 사람 모두를 얻을 수 가져 오기 실행합니다. 예 : 체스 클럽의 모든 회원을 얻으십시오. 필자는 SQL을 사용하여 PersonInClub을 대표하는 세 번째 테이블을 만들고 두 테이블을 결합하는 두 개의 조인을 수행 한 다음 모든 Persons를 선택합니다 (Where Clubs.name = 'Chess Club'). 그러나이 작업을 가져 오기로 구현하는 데 어려움을 겪고 있습니다. 의뢰.

내 궁극적 인 목표는 NSFetchedRequestControllerNSFetchRequst을 쓰는 것입니다. 그렇기 때문에 클럽 이름을 Chess Club으로 가져온 다음 모든 회원을 붙잡을 수는 없습니다 (내가 오해하지 않는 한 컨트롤러에서 결과를 가져올 수 있습니까?).

모든 의견을 환영합니다.

편집 : 여기 내 NSFetchedResultController에 대한 현재 코드가 있습니다. 이게 어떻게 도움이 될지 모르겠다.

- (NSFetchedResultsController *)fetchedResultsController 
{ 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 

    [fetchRequest setEntity:[NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext]]; 


    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];  
    [fetchRequest setSortDescriptors:@[sortDescriptor]]; 

    // This will give me the chess club but I want it's members! 
    // I tried things like @"[self.name = %@ members]" and stuff to try and retrieve the members as the results 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"self.name = %@", @"Chess Club"]; 
    [fetchRequest setPredicate:predicate]; 

    // an array with just the Chess Club in it 
    NSArray *results = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 

    // Printing the members, The members are correct but again, they are not attached to the Controller, the actual club is 
    NSSet *members = [results.lastObject members]; 
    NSMutableArray *memberNames = [NSMutableArray arrayWithCapacity:members.count]; 
    for (Person *p in [members allObjects]) 
     [memberNames addObject:p.firstName]; 
    NSLog(@"All Members: %@", memberNames); // prints all of the members accurantely 

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

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

    return _fetchedResultsController; 
} 
+1

당신이해야 같은 요청에 대한 설치 조건 : [자 NSPredicate predicateWithFormat : @ @ "어떤 clubs.name == %의 @", "체스이 경우 (https://github.com/magicalpanda/MagicalRecord) 이 코드는 코드의 한 라인으로 줄일 수 클럽"]; 또는 당신이 이미 체스 클럽 엔티티를 가지고 있다면 요청이 필요 없습니다.> club.members – NeverBe

+0

@NeverBe 알았지 만 NSSet을받는 대신 NSFetchedRequestController에 어떻게 넣을 수 있습니까? '? – Firo

+1

당신은 predicate를 가진 요청으로 init NSFetchedRequestController를 사용할 수 있습니다. NSFetchedRequestController를 사용하는 것이 필수입니까? 코드를보다 잘 보여줍니다. – NeverBe

답변

4

음, 결국 나는 결국 그것을 알아 냈다.

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"firstName" ascending:NO];  
[fetchRequest setSortDescriptors:@[sortDescriptor]]; 

// This is the important part 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"ANY self.clubs.name = %@", @"Chess Club"]; 
// 

[fetchRequest setPredicate:predicate]; 

// Just to clarify received data 
NSArray *allStudentsInChessClub = [self.managedObjectContext executeFetchRequest:fetchRequest error:nil]; 


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

// My NSFetchedResultsController with students from the Chess Club 
self.fetchedResultsController = aFetchedResultsController; 

나는 속성에 액세스를 시도 할 것이라고 생각하기 때문에이 작동하지 않을 것입니다 가정 : 그것은 내가 코드를 다음과 같은 경우에 사용, 실제로는 매우 간단했다 (I 질문과 대답을 명확히 도움이되는 추가 코드를 포함했다) nameNSSet의 값이 아닙니다. 이것은 체스 클럽 자체가 아니라 체스 클럽의 모든 멤버를 반환했습니다!

+0

Person!이 아닌 Club 엔티티를 사용하는 것보다 Club 엔티티를 검색하려면! [fetchRequest setEntity : [NSEntityDescription entityForName : @ "Club"inManagedObjectContext : self.managedObjectContext]]; – NeverBe

+0

'self.clubs.name'의'clubs'는 많은'Club' 객체를 포함하고있는 일대 다 관계입니다. 나는 체스 클럽이라는 특정 클럽에있는 모든 '인물'을 원하며 모든 사람이 여러 클럽에 가입 할 수 있습니다.이는 체스 클럽에있는 사람이있는 모든 클럽을 "반복"하여 배열에 추가합니다. 이를 통해 정상적인 페치 요청을 실행하는 대신 NSFetchedRequestController를 사용할 수 있습니다. 각 '사람'이 한 클럽에 한정되어있는 경우에만 귀하의 방법이 효과가 있다고 생각합니다 – Firo

+0

당신은 여전히 ​​나를 혼란스럽게합니다. 당신이 갖고있는 것과 갖고 싶은 것? 주요 질문은 요청할 소스 데이터가 무엇입니까? 어떤 데이터 데이터가 NSFetchedRequestController에 있어야합니까? – NeverBe

0
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Club" inManagedObjectContext:self.managedObjectContext]; 
[fetchRequest setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:NO];  
[fetchRequest setSortDescriptors:@[sortDescriptor]]; 

// This is the important part 
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"name = %@", @"Chess Club"]; 
// 

[fetchRequest setPredicate:predicate]; 

// Just to clarify received data 
Club *club = [[self.managedObjectContext executeFetchRequest:fetchRequest error:nil] lastObject]; 

// 모든 클럽 회원은 club.member 속성을 통해 액세스 할 수 있습니다. 한 클럽을 검색하면 NSFetchedResultsController가 필요하지 않다고 생각합니다.

P. MagicalRecord 프레임 워크를 사용하는 것이 좋습니다.

Club *club = [Club MR_findFirstByAttribute:@"name" withValue:@"Chess Club"]; 
NSLog(@"club members %@", club.members); 
+0

내 문제는 클럽 회원을 확보하는 것이 아니라 NSFetchedResultController에 참여시키는 것에 관한 것이 었습니다. 귀하의 모범을 통해 이것을 할 수있는 방법이 있습니까? 'Person' 개체가 tableview에 표시되기 때문에 NSFetchedResultsController가 필요합니다. 'Person'은 위에 열거 된 훨씬 더 많은 정보를 포함하고 있습니다 만, 단순화를 위해 그것을 제거했습니다. 테이블이 자주 바뀔 것이므로 나는 NSFetchedResultsController' – Firo

+0

의 이점을 원한다. NSPredicate * predicate = [NSPredicate predicateWithFormat : @ "ANY self.clubs.name = % @", @ "Chess Club"]; 가 작동해야합니다. – NeverBe