NSFetchedResultsController, NSPredicate 以对多关系检索子对象
Posted
技术标签:
【中文标题】NSFetchedResultsController, NSPredicate 以对多关系检索子对象【英文标题】:NSFetchedResultsController, NSPredicate to retrieve child objects in to-many relationship 【发布时间】:2013-08-30 19:41:09 【问题描述】:我试图弄清楚我是否使用正确的谓词来获取具有以下模型和代码的 FRC 的给定 Category 对象的 Item 对象:
类别 > 项目
NSEntityDescription *entity =
[NSEntityDescription entityForName:@"Item"
inManagedObjectContext:self.managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setFetchBatchSize:20];
NSSortDescriptor *sortDescriptor =
[[NSSortDescriptor alloc] initWithKey:@"itemLabelText" ascending:YES];
NSArray *sortDescriptors = @[sortDescriptor];
[fetchRequest setSortDescriptors:sortDescriptors];
if (self.category.items)
NSPredicate *predicate = [NSPredicate predicateWithFormat:@"SELF IN %@",
self.category.items];
[fetchRequest setPredicate:predicate];
如果Category中没有Item,我将collectionview中的item数量设置为0。
- (NSInteger)collectionView:(UICollectionView *)collectionView
numberOfItemsInSection:(NSInteger)section
if ((self.category.items == nil) || [self.category.items count] == 0)
return 0;
id <NSFetchedResultsSectionInfo> sectionInfo =
[self.fetchedResultsController sections][section];
return [sectionInfo numberOfObjects];
FRC 返回对象上下文中的所有项目,而不仅仅是指定类别中的项目。我正在尝试直接获取 Item 对象,而不是创建/引用额外的属性。
【问题讨论】:
【参考方案1】:获取指定类别的所有项目的“通常”(更简单的)谓词是
[NSPredicate predicateWithFormat:@"category = %@", self.category]
假设“类别”是从“项目”到“类别”的反比关系。
【讨论】:
感谢 Martin,您的谓词绝对是更好的方法。 经过进一步调查,我发现我的问题源于假设 FRC 动态变化。我正在对 FRC 谓词进行更改,并希望输出自行更改。我执行了以下代码来解决这个问题: self.fetchedResultsController = nil; [NSFetchedResultsController deleteCacheWithName:@"Master"]; [[[self fetchedResultsController] collectionView] reloadData];以上是关于NSFetchedResultsController, NSPredicate 以对多关系检索子对象的主要内容,如果未能解决你的问题,请参考以下文章