核心数据不取对象

问题描述:

你好,这里是我NSFetchedResultsController实现:核心数据不取对象

-(NSFetchedResultsController *)fetchedResultsController 
{ 
    if (_fetchedResultsController != nil) { 
     return _fetchedResultsController; 
    } 
    NSLog(@"context - %@",self.context); 
    NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription 
            entityForName:@"Categories" inManagedObjectContext:self.context]; 
    [fetchRequest setEntity:entity]; 

    NSSortDescriptor *sort = [[NSSortDescriptor alloc] 
           initWithKey:@"name" ascending:YES]; 
    [fetchRequest setSortDescriptors:@[sort]]; 

    [fetchRequest setFetchBatchSize:20]; 

    NSFetchedResultsController *theFetchedResultsController = 
    [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest 
             managedObjectContext:self.context sectionNameKeyPath:nil 
                cacheName:@"root"]; 
    _fetchedResultsController = theFetchedResultsController; 
    _fetchedResultsController.delegate = self; 
// [[self context] fetchObjectsForEntityName:@"Categories" withPredicate: 
//  nil] ; 
    return _fetchedResultsController; 
} 

fetchedResultsController.fetchedObjects始终是零。 这里是我如何添加对象:

-(void)addCategoryWithName:(NSString *)name 
{ 
    NSLog(@"context - %@",self.context); 
    Categories *category = (Categories *)[NSEntityDescription insertNewObjectForEntityForName:@"Categories" inManagedObjectContext:self.context]; 
    category.name = name; 
    NSLog(@"category name - %@",category.name); 
    category.displayOrder = [NSNumber numberWithFloat:1.0f]; 
    //  site.displayOrder = displayOrder; 

    NSError __block *error; 
    if (![self.context save:&error]){ 
     NSLog(@"Error saving - %@", [error localizedDescription]); 
    } 
} 

没有错误,什么都没有。如果我在Documents目录中看到我的.sqlite文件,那么它已被修改,但我无法获取任何获取的对象。真的很奇怪,我使用基本上相同的代码为我的其他应用程序,它工作得很好。

任何想法?

+1

你是否在某处调用了'performFetch'? - 如果'sectionNameKeyPath = nil',我也不会指定'cacheName'。 – 2013-02-09 19:51:27

+0

完全忘了performFetch。它似乎没有编程一段时间有它的影响。但是,在这里学到了很好的经验,谢谢!只有一个问题 - 为什么不在sectionNameKeyPath为零时指定缓存? – Devfly 2013-02-09 19:58:56

+0

我会将其放入我的答案中... – 2013-02-09 19:59:51

您必须在获取的结果控制器上调用performFetch一次。否则,它不会获取任何东西,也不会跟踪更改。例如,添加

NSError *error; 
if (![_fetchedResultsController performFetch:&error]) { 
    // error handling 
} 

末尾的fetchedResultsController getter方法。

注:看来指定 cacheName没有 sectionNameKeyPath可能会造成问题,看 UITableView with NSFetchedResultsController Does Not Load the Second Time。由于缓存用于缓存段信息,因此如果没有段,则不需要。

更新:前面的注释不再有效,结果证明链接问题中的问题有不同的原因。