NSFetchedResultsController与多个部分中的项目?

时间:2013-03-05 16:02:21

标签: ios objective-c core-data nsfetchedresultscontroller

我有一个托管对象来表示地图上的一个点。这些点有零多种类型。我还想显示一个分段表视图。当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)'

1 个答案:

答案 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实体填充单元格应该是显而易见的。