Core data 使用多个实体的NSPredicate和NSFetchedResultsController保存核心数据相关数据并检索
我对核心数据还相当陌生,并且仍在努力理解如何访问和过滤相关数据。我的问题是,要么我没有将数据正确地放入managedObjectContext,要么我没有正确地将其取出。我想是第一个,但我不确定 这是我的数据模型,其中有两个实体是一对多的:我计划在一个级别的关系正常工作后进行重构 我有一个季节SVC,你点击一个季节名称,该季节的游戏列表应该出现在游戏SVC中,你可以选择添加或编辑现有的游戏。这在第一次通过时效果很好。我可以通过GameDetailsVC中的以下代码添加和编辑游戏:Core data 使用多个实体的NSPredicate和NSFetchedResultsController保存核心数据相关数据并检索,core-data,nspredicate,nsfetchedresultscontroller,Core Data,Nspredicate,Nsfetchedresultscontroller,我对核心数据还相当陌生,并且仍在努力理解如何访问和过滤相关数据。我的问题是,要么我没有将数据正确地放入managedObjectContext,要么我没有正确地将其取出。我想是第一个,但我不确定 这是我的数据模型,其中有两个实体是一对多的:我计划在一个级别的关系正常工作后进行重构 我有一个季节SVC,你点击一个季节名称,该季节的游戏列表应该出现在游戏SVC中,你可以选择添加或编辑现有的游戏。这在第一次通过时效果很好。我可以通过GameDetailsVC中的以下代码添加和编辑游戏: -(IBAc
-(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];
所以,回答我自己的问题,我既没有挽救与本赛季有关的比赛,我的判断也错了
我希望这对另一个新手有所帮助