我是Core Data的新手,我仍在尝试理解访问和过滤相关数据。我的问题是要么我没有正确地将数据输入到managedObjectContext中,要么我没有正确地将它拉出来。 (我想是第一个,但我不确定。)
这是我的数据模型,其中包含两个与一对多相关的实体:(我计划在一级关系工作后进行重构。)
我有一个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中时,添加的游戏没有与正确的季节“关联”。否则,我希望谓词找到它们。
你能帮助这个菜鸟吗?感谢。答案 0 :(得分: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];
所以,为了回答我自己的问题,我既没有保存与赛季相关的游戏,也没有我的谓词错误。
我希望其中一些可以帮助另一位新秀。