2013-02-09 121 views
0

你好,這裏是我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

回答

1

您必須在獲取的結果控制器上調用performFetch一次。否則,它不會獲取任何東西,也不會跟蹤更改。例如,添加

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

末尾的fetchedResultsController getter方法。

注:看來指定 cacheName沒有 sectionNameKeyPath可能會造成問題,看 UITableView with NSFetchedResultsController Does Not Load the Second Time。由於緩存用於緩存段信息,因此如果沒有段,則不需要。

更新:前面的註釋不再有效,結果證明鏈接問題中的問題有不同的原因。