首页 文章

保存核心数据相关数据并使用NSPredicate和NSFetchedResultsController检索多个实体

提问于
浏览
0

我是Core Data的新手,我仍在尝试理解访问和过滤相关数据 . 我的问题是要么我没有正确地将数据输入到managedObjectContext中,要么我没有正确地将它拉出来 . (我想是第一个,但我不确定 . )

这是我的数据模型,其中两个实体与一对多相关:(我计划在一级关系工作后进行重构 . )

enter image description here

我有一个SeasonsVC,你点击一个赛季名称,那个赛季的比赛列表应该出现在GamesVC中,你可以选择添加或编辑现有的比赛 . 这在第一次通过时工作正常 . 我可以通过GameDetailsVC中的代码添加和编辑游戏:

-(IBAction)done:(UIBarButtonItem *)sender {

    Game *game = nil;

    if (self.gameToEdit != nil) {
        game = self.gameToEdit;
        NSLog(@"Hitting gametoedit");
    } else {
        game = [NSEntityDescription insertNewObjectForEntityForName:@"Game" inManagedObjectContext:self.managedObjectContext];
        NSLog(@"Hitting new game");
    }

    game.opponent = self.opponentTextField.text;
    //season.seasonDescription = self.seasonDescriptionTextView.text;

    NSLog(@"Game to edit: %@", game.opponent);
    //NSLog(@"Season: %@", season);

    //NSLog(@"MOC in done: %@", self.managedObjectContext);
    //NSLog(@"Season name: %@", season.seasonName);

    [self dismissViewControllerAnimated:YES completion:nil];
}

然后我可以通过fetchedResultsController和委托方法在GamesVC中看到游戏,但每个游戏都与每个季节相关联 . 一旦我尝试使用谓词过滤数据,以便我只看到为该季节添加的游戏,所有游戏都会消失 . 以下是GamesVC的代码:

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

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

    NSLog(@"Season name for predicate %@", self.season.seasonName);//shows correct season name

    NSPredicate *predicate = [NSPredicate predicateWithFormat:[NSString stringWithFormat:@"season.seasonName like '%@'", self.season.seasonName]];

    [fetchRequest setPredicate: predicate];


    NSSortDescriptor *sortDescriptor = [NSSortDescriptor sortDescriptorWithKey:@"dateOfGame" ascending:NO] ;

    [fetchRequest setSortDescriptors:@[sortDescriptor]];

    [fetchRequest setFetchBatchSize:20];

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

    return _fetchedResultsController;

}

因为我可以在谓词陈述之前记录正确的季节名称,所以当我将它们放在上面显示的done:方法中的MOC中时,我认为添加的游戏没有与正确的季节“关联” . 否则,我希望谓词找到它们 .

你能帮助这个菜鸟吗?谢谢 .

1 回答

  • 0

    一天后,我把它排序了 . 我需要对我正在做的事情进行三处修改 .

    首先,在我的GameListVC中的prepareForSegue中,我需要通过将代码更改为此来将季节传递给GameDetailsVC . (刚刚添加了一行:controller.season = self.season)

    //pass the Season object to be edited
        NSIndexPath *indexPath = [self.tableView indexPathForCell:sender];
        Game *gameToEdit = [self.fetchedResultsController objectAtIndexPath:indexPath];
        controller.gameToEdit = gameToEdit;
        controller.season = self.season;
    

    其次,我必须将新的/编辑过的游戏对象放入MOC中,将这两行添加到GameDetailsVC中的done:方法中 .

    NSMutableSet *games = [self.season mutableSetValueForKey:@"games"];
    [games addObject:game];
    

    第三,我需要在GameListVC中的fetchedResultsController方法中简化我的谓词语句 .

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"season.seasonName like %@", self.season.seasonName];
    

    所以,为了回答我自己的问题,我既没有保存与赛季相关的游戏,也没有说出我的谓词错误 .

    我希望其中一些可以帮助另一个新秀 .

相关问题