核心数据导航与关系

时间:2010-08-07 10:52:07

标签: iphone objective-c cocoa-touch core-data

My Core Data模型如下所示:

alt text http://fwdr.org/lg4q

实体players的{​​{1}}关系是到多个关系,并且将包含与该Game实体相关的所有player个对象

我的Game看起来像this < - link 。 表格视图显示所有游戏,我将如何,选择游戏时显示/推送另一个UITableView以显示UITableView关系中的所有玩家。

我已经尝试了这一点,但无济于事,我认为我走在正确的轨道上,但却被许多我无法解决的错误所困扰。

2 个答案:

答案 0 :(得分:2)

只需创建另一个UITableViewController子类,将其包装到导航控制器中并推送。请务必使用NSFetchedResultsController填充表格视图。您应该将Game对象传递给第二个表视图控制器,以便为它构建谓词。

一些代码段:

将视图控制器包装到表视图控制器的tableView:(UITableView *)tableView didSelectRowAtIndexPath:方法中的导航中。

    TagsViewController *tagsViewController = [[TagsViewController alloc] initWithMode:TagsViewControllerModeSelect]; // You can view plain style, I've just created my initializer
    tagsViewController.unit = self.unit; // You can pass the Game here
    [self.navigationController pushViewController:tagsViewController animated:YES];
    [tagsViewController release];

这里是获取结果controller lazy initializer

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

    NSEntityDescription* entity = [NSEntityDescription entityForName:@"StudyUnit" inManagedObjectContext:managedObjectContext];

    NSFetchRequest* fetchRequest = [[NSFetchRequest alloc] init];
    [fetchRequest setEntity:entity];

    NSString *predicateString = [[DefaultsManager sharedInstance] filterMode] == kFilterModeShowAll ? @"explanation != '' AND show == YES" : @"ANY tag.show == YES AND explanation != '' AND show == YES"; 
    NSPredicate *predicate = [NSPredicate predicateWithFormat:predicateString]; // Here goes your predicate to query players for particular game
    [fetchRequest setPredicate:predicate];

    NSSortDescriptor* sortByWordDescriptor = [[NSSortDescriptor alloc] initWithKey:@"subject" ascending:YES];
    NSArray* sortArray = [[NSArray alloc] initWithObjects:sortByWordDescriptor, nil];
    [fetchRequest setSortDescriptors:sortArray];

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

    [fetchRequest release];
    [sortByWordDescriptor release];
    [sortArray release];
    [controller release];

    return fetchedResultsController;
}

然后只需实施NSFetchedResultsController个代表,发送performFetch个消息,然后瞧!

UPD:

假设您的游戏对象通常在第二个控制器中声明为NSManagedObject

NSManagedObject *game;

然后你可以建立这样的谓词:

NSEntityDescription* entity = [NSEntityDescription entityForName:@"Player" inManagedObjectContext:managedObjectContext];
//...
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"game == %@", self.game];

这只是理论上的,不能测试对不起^^

答案 1 :(得分:2)

在第二个tableView中,因为你已经有了游戏对象,所以你真的不需要另一个NSFetchedResultsController。您可以直接从注入第二个视图控制器的游戏对象中获取玩家,并使用关系显示玩家。

如果您希望玩家在用户查看第二个控制器时进行更改,则只需要在此情况下使用第二个NSFetchedResultsController。否则只需走完这段关系就足够了,并且会使用更少的内存/ CPU。