2009-09-01 114 views
6

我將一個NSFetchedResultsController放入我的代碼,所以我得到了很好的自動切片我的表視圖數據。如何正確配置NSFetchedResultsController

所以我正在運行一個測試,以確保一切工作正常。我在持久存儲中有一個Book實體。我將首先執行獲取舊方式,然後我會嘗試使用NSFetchedResultsController。這兩個代碼塊之間的區別僅僅是2行。

代碼沒有 NSFetchedResultsController:

NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
[request setEntity:entity]; 

NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release]; 

    //The following 2 lines will be replaced by the NSFetchedResultsController 
NSMutableArray *mutableFetchResults = [[[self.managedObjectContext executeFetchRequest:request error:nil] mutableCopy] autorelease]; 
Book *result = (Book*)[mutableFetchResults objectAtIndex:0]; 

NSString* title = [result valueForKey:@"title"]; 
NSString* priority = [result valueForKeyPath:@"priority.name"]; 


[request release]; 

現在我在替換爲NSFetchedResultsController行:

NSFetchedResultsController* fetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:self.managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"];                                                                           

Book *result = (Book*)[fetchedResultsController objectAtIndexPath:[NSIndexPath indexPathForRow:0 inSection:0]]; 

似乎很添油加醋。第一個代碼塊可以正確提取單個Book實體。但是,NSFetchedResultsController的代碼不會。相反,它返回零。

我的問題是:我在這個例子中正確配置NSFetchedResultsController?

(注意,該NSFetchedResultsController的fetchedObjects屬性也是零)

回答

13

我覺得你還是需要告訴NSFetchedResultsController實際執行讀取:

NSError *error; 
BOOL success = [controller performFetch:&error]; 

(從例如在拍攝NSFetchedResultsController參考)

另一件似乎很奇怪的事情:你真的想用「title」作爲sectionNameKeyPath嗎?基本上不會爲每本書創建一個單獨的部分?

+0

「標題」組織只是一個測試,以啓動和運行。我實際上想通過作者姓名的關鍵路徑進行區分,但希望通過一個簡單的示例來使用它。 – 2009-09-02 02:24:13

+0

這真的很讓人傷心,我並沒有真正執行抓取。我不知道爲什麼我假定在初始化時執行了獲取。 謝謝 – 2009-09-02 23:12:28

+0

謝謝,那幫助我:) – mateusmaso 2011-06-19 22:44:03

7

需要初始化您NSFetchedResultsController只有一次,,具體如下代碼假設

NSFetchedResultsController *fetchedResultsController; 
NSManagedObjectContext *managedObjectContext; 

在控制器的頭聲明,並managedObjectContext已經正確初始化。

- (void)viewDidLoad { 

    [super viewDidLoad]; 

    NSError *error; 
    if (![[self fetchedResultsController] performFetch:&error]) { 
     // Handle error 
     NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 

    } 

    NSLog(@"%d objects fetched", [[fetchedResultsController fetchedObjects] count]); 
} 

- (NSFetchedResultsController *)fetchedResultsController { 

    if (fetchedResultsController != nil) { 
     return fetchedResultsController; 

    } 

    /* 
    Set up the fetched results controller. 
    */ 



    // Create the fetch request for the entity. 
    NSFetchRequest *request = [[NSFetchRequest alloc] init]; 
    // Edit the entity name as appropriate. 
    NSEntityDescription *entity = [NSEntityDescription entityForName:kBookEntityName inManagedObjectContext:self.managedObjectContext]; 
    [request setEntity:entity]; 

/* Optional settings 

    [request setResultType:NSManagedObjectResultType]; 
    [request setIncludesPropertyValues:YES]; 
    [request setIncludesPendingChanges:NO]; 
    [request setReturnsObjectsAsFaults:NO]; 
*/ 


    // Edit the sort key as appropriate. 
    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"title" ascending:NO]; 
NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil]; 
[request setSortDescriptors:sortDescriptors]; 
[sortDescriptor release]; 
[sortDescriptors release];; 

    // Edit the section name key path and cache name if appropriate. 
    // nil for section name key path means "no sections". 
    NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:request managedObjectContext:managedObjectContext sectionNameKeyPath:@"title" cacheName:@"BookList"]; 
    aFetchedResultsController.delegate = self; 
    self.fetchedResultsController = aFetchedResultsController; 

    [aFetchedResultsController release]; 
    [request release]; 


    return fetchedResultsController; 
}