0

我最近开始使用 CoreData 并遇到了一个我无法弄清楚的复杂(至少对我而言)提取。我四处搜索,但很难找到好的术语来搜索,因此没有足够的结果。这是我的 coredata 模型的基本示例:

在此处输入图像描述

我想要做的是执行获取以获取作为特定 Club 成员的所有 Persons。示例:获取国际象棋俱乐部的所有成员。我可以使用 SQL 轻松做到这一点(有代表 PersonInClub 的第三个表,执行两个连接以组合这两个表,然后选择 Club.name = 'Chess Club' 的所有人员),但我正在努力通过获取来实现这一点要求。

我的最终目标是NSFetchRequstNSFetchedRequestController. 这就是为什么我不能只用名称为俱乐部获取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;
}  
4

2 回答 2

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;

我认为这不起作用,因为我认为它会尝试nameNSSet集合中的值访问属性。这返回了国际象棋俱乐部的所有成员,而不是国际象棋俱乐部本身!

于 2013-06-04T09:17:17.167 回答
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。

PS 我推荐你使用 MagicalRecord 框架。( https://github.com/magicalpanda/MagicalRecord ) 在这种情况下,您的代码将减少到 1 行代码:

Club *club = [Club MR_findFirstByAttribute:@"name" withValue:@"Chess Club"];
NSLog(@"club members %@", club.members);
于 2013-06-04T10:50:36.347 回答