1

为什么在添加if statements到后会产生缓存错误NSPredicate?在我尝试根据 UITABLEVIEW 的标题过滤结果后出现错误。

我收到以下错误:

CoreData: FATAL ERROR: The persistent cache of section information does not match the current configuration.  You have illegally mutated the NSFetchedResultsController's fetch request, its predicate, or its sort descriptor without either disabling caching or using +deleteCacheWithName

我查看了其他类似的错误,但无法将它们与我的代码相关联。

- (NSFetchedResultsController *)fetchedResultsController {

    if (_fetchedResultsController != nil) {
        return _fetchedResultsController;
    }

    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    NSEntityDescription *entity = [NSEntityDescription
                                   entityForName:@"ExcerciseInfo" inManagedObjectContext:managedObjectContext];
    [fetchRequest setEntity:entity];


    NSSortDescriptor *sort = [[NSSortDescriptor alloc]
                              initWithKey:@"details.muscle" ascending:NO];
    [fetchRequest setSortDescriptors:[NSArray arrayWithObject:sort]];

    [fetchRequest setFetchBatchSize:20];

// Sort Results
if ([self.title isEqual: @"Abdominals"]) {

    NSPredicate *predicate = [NSPredicate predicateWithFormat:@"details.muscle == %@", @"Back"];
    [fetchRequest setPredicate:predicate];

     }

else if ([self.title isEqual: @"Arms"]) {

        NSPredicate *predicate = [NSPredicate predicateWithFormat:@"details.muscle == %@", @"Biceps"];
        [fetchRequest setPredicate:predicate ];

    }

    NSFetchedResultsController *theFetchedResultsController =
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest
                                        managedObjectContext:managedObjectContext sectionNameKeyPath:nil
                                                   cacheName:@"Root"];
    self.fetchedResultsController = theFetchedResultsController;
    _fetchedResultsController.delegate = self;

    return _fetchedResultsController;

}
4

2 回答 2

3

当你离开视图时,你需要在tableViewController中:

 -(void)viewDidDisappear:(BOOL)animated{
     [super viewDidDisappear:animated];
     [NSFetchedResultsController deleteCacheWithName:@"Root"];
     self.fetchedResultsController = nil;

 }

并且:

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
        [NSFetchedResultsController deleteCacheWithName:@"Root"];
    }
    return self;
}

或者最好的形式在这里(一起):

- (id)initWithStyle:(UITableViewStyle)style
{
    self = [super initWithStyle:style];
    if (self) {
        // Custom initialization
        [NSFetchedResultsController deleteCacheWithName:@"Root"];
        self.fetchedResultsController = nil;
    }
    return self;
}
于 2014-06-06T06:40:59.380 回答
1

基本上,如果您将 acacheName与 fetched results 控制器一起使用,则不应更改 fetch 请求。

如果您确实更改了获取请求,则必须删除缓存,否则您会收到与缓存内容相关的错误,这些内容不再与您获取的结果匹配。

如果您想更改获取请求,您通常不会从拥有缓存中获得任何好处。

于 2013-06-27T22:36:31.067 回答