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

Core data 使用多个实体的NSPredicate和NSFetchedResultsController保存核心数据相关数据并检索,core-data,nspredicate,nsfetchedresultscontroller,Core Data,Nspredicate,Nsfetchedresultscontroller,我对核心数据还相当陌生,并且仍在努力理解如何访问和过滤相关数据。我的问题是,要么我没有将数据正确地放入managedObjectContext,要么我没有正确地将其取出。我想是第一个,但我不确定 这是我的数据模型,其中有两个实体是一对多的:我计划在一个级别的关系正常工作后进行重构 我有一个季节SVC,你点击一个季节名称,该季节的游戏列表应该出现在游戏SVC中,你可以选择添加或编辑现有的游戏。这在第一次通过时效果很好。我可以通过GameDetailsVC中的以下代码添加和编辑游戏: -(IBAc

我对核心数据还相当陌生,并且仍在努力理解如何访问和过滤相关数据。我的问题是,要么我没有将数据正确地放入managedObjectContext,要么我没有正确地将其取出。我想是第一个,但我不确定

这是我的数据模型,其中有两个实体是一对多的:我计划在一个级别的关系正常工作后进行重构

我有一个季节SVC,你点击一个季节名称,该季节的游戏列表应该出现在游戏SVC中,你可以选择添加或编辑现有的游戏。这在第一次通过时效果很好。我可以通过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:方法将添加的比赛放入主运行中心时,它们与正确的赛季没有关联;否则,我希望谓词能够找到它们


你能帮这个新手吗?谢谢。

一天后我把这个整理好了。我需要对我正在做的事情做三个改变

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

    //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;
其次,我必须通过在GameDetailsVC中的done:方法中添加这两行代码,将新的/编辑的游戏对象放入MOC

NSMutableSet *games = [self.season mutableSetValueForKey:@"games"];
[games addObject:game];
第三,我需要简化GameListVC中fetchedResultsController方法中的谓词语句

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"season.seasonName like %@", self.season.seasonName];
所以,回答我自己的问题,我既没有挽救与本赛季有关的比赛,我的判断也错了

我希望这对另一个新手有所帮助