我最近开始使用 CoreData 并遇到了一个我无法弄清楚的复杂(至少对我而言)提取。我四处搜索,但很难找到好的术语来搜索,因此没有足够的结果。这是我的 coredata 模型的基本示例:
我想要做的是执行获取以获取作为特定 Club 成员的所有 Persons。示例:获取国际象棋俱乐部的所有成员。我可以使用 SQL 轻松做到这一点(有代表 PersonInClub 的第三个表,执行两个连接以组合这两个表,然后选择 Club.name = 'Chess Club' 的所有人员),但我正在努力通过获取来实现这一点要求。
我的最终目标是NSFetchRequst
为NSFetchedRequestController
. 这就是为什么我不能只用名称为俱乐部获取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;
}