최근에 CoreData를 사용하기 시작했는데 알아 내지 못했던 복잡한 (적어도 나에게) 페치가 발생했습니다. 나는 주변을 수색했지만 좋은 용어로 검색하는 데 어려움을 겪었으므로 만족스러운 결과를 얻지 못했다. 여기 내 coredata 모델의 기본 예입니다 : 내가 뭘하려고 오전양방향 다 대 관계에 대한 NSFetchRequest
은 특정 클럽의 멤버 인 사람 모두를 얻을 수 가져 오기 실행합니다. 예 : 체스 클럽의 모든 회원을 얻으십시오. 필자는 SQL을 사용하여 PersonInClub을 대표하는 세 번째 테이블을 만들고 두 테이블을 결합하는 두 개의 조인을 수행 한 다음 모든 Persons를 선택합니다 (Where Clubs.name = 'Chess Club'). 그러나이 작업을 가져 오기로 구현하는 데 어려움을 겪고 있습니다. 의뢰.
내 궁극적 인 목표는 NSFetchedRequestController
에 NSFetchRequst
을 쓰는 것입니다. 그렇기 때문에 클럽 이름을 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;
}
당신이해야 같은 요청에 대한 설치 조건 : [자 NSPredicate predicateWithFormat : @ @ "어떤 clubs.name == %의 @", "체스이 경우 (https://github.com/magicalpanda/MagicalRecord) 이 코드는 코드의 한 라인으로 줄일 수 클럽"]; 또는 당신이 이미 체스 클럽 엔티티를 가지고 있다면 요청이 필요 없습니다.> club.members – NeverBe
@NeverBe 알았지 만 NSSet을받는 대신 NSFetchedRequestController에 어떻게 넣을 수 있습니까? '? – Firo
당신은 predicate를 가진 요청으로 init NSFetchedRequestController를 사용할 수 있습니다. NSFetchedRequestController를 사용하는 것이 필수입니까? 코드를보다 잘 보여줍니다. – NeverBe