我有一个托管对象来表示地图上的一个点。这些点有零多种类型。我还想显示一个分段表视图。当type是MapPOI对象上的单个值时,我使用了NSFetchedResultsController。但是现在类型是在不同的对象中,“MapPOI”之间的关系称为“类型”,我该如何编写查询(可以吗?)
原件:
- (NSFetchedResultsController *)newFetchedResultsControllerWithSearch:(NSString *)searchString
{
NSFetchRequest *request = [NSFetchRequest fetchRequestWithEntityName:@"MapPOI"];
if(searchString.length)
{
request.predicate = [NSPredicate predicateWithFormat:@"name CONTAINS[cd] %@", searchString];
}
request.sortDescriptors = [NSArray arrayWithObjects:[NSSortDescriptor sortDescriptorWithKey:@"type" ascending:YES ],[NSSortDescriptor sortDescriptorWithKey:@"name" ascending:YES ],nil ];
NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.campus.managedObjectContext
sectionNameKeyPath:@"type"
cacheName:nil];
aFetchedResultsController.delegate = self;
NSError *error = nil;
if (![aFetchedResultsController performFetch:&error])
{
NSLog(@"Error performing institution fetch with search string %@: %@, %@", searchString, error, [error userInfo]);
}
return aFetchedResultsController;
}
我试过像
这样的东西NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request
managedObjectContext:self.campus.managedObjectContext
sectionNameKeyPath:@"types.name"
cacheName:nil];
但那造成了
Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: 'Invalid to many relationship in setPropertiesToFetch: (types.name)'
答案 0 :(得分:3)
NSFetchedResultsController
非常灵活,可以用于各种视图,而不仅仅是表格视图。
sectionNameKeyPath
当然是错的。它显然必须是一对一的关系。假设一个MapPOI
只能有一个类型,关键路径应该是@"type.name"
。
但是,如果一个MapPOI
可以有多种类型,则可以执行以下操作:
获取类型实体而不是POI实体。您不需要部分键路径。现在objectAtIndexPath:indexPath.row
将获取Type
托管对象。
对于部分数量,使用
self.fetchedResultsController.fetchedObjects.count
对于章节标题,请使用
[[self.fetchedResultsController.fetchedObjects objectAtIndex:section] name];
对于部分使用中的行计数
Type *type = [self.fetchedResultsController.fetchedObjects objectAtIndex:section];
type.mapPOIs.count;
如何使用MapPOI
实体填充单元格应该是显而易见的。