2011-09-05 58 views
1

我有2個包含UITableView的視圖。它們在iPad上同時顯示,並排顯示。如何使用NSFetchedResultsController基於實體關係提取結果?

我對所有數據都使用核心數據。這兩個表都需要編輯(行添加,刪除等),所以我想在每個視圖中使用NSFetchedResultsController來爲我處理所有這些。

第二個表的內容取決於第一個表中選擇的內容。所以,當選擇第一個表中的一個項目時,該對象被傳遞給第二個表的視圖(所以我已經有權訪問應該進入第二個表的數據),但是我想嘗試使用如果可能,所有內置的NSFRC處理。

該模式沿線:大學(uniID,uniName,學生)和學生(stuID,stuName,大學)。所以關係是:大學< - >>學生。

我使用的NSFRC下面的代碼,但它返回0結果:

- (NSFetchedResultsController *)fetchedResultsController { 

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

NSManagedObjectContext *context = appDelegate.managedObjectContext; 
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
NSEntityDescription *entity = [NSEntityDescription entityForName:@"Student" inManagedObjectContext:context]; 
[fetchRequest setEntity:entity]; 

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

[fetchRequest setFetchBatchSize:20]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"university == %@",self.selectedUniversity]; 
[fetchRequest setPredicate:predicate]; 

NSFetchedResultsController *theFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:context sectionNameKeyPath:nil cacheName:nil]; 

self.fetchedResultsController = theFetchedResultsController; 
fetchedResultsController.delegate = self; 

[sort release]; 
[fetchRequest release]; 
[theFetchedResultsController release]; 

return fetchedResultsController;  

}

我將不勝感激,如果有人至少可以點我在正確的方向。 ..

回答

0

好了,我解決了這個問題。該NSFRC時所需的謂詞項改變(即大學被選中),當然沒有被更新,因爲:

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

具有NSFRC重建每次叫時間(除去上面的代碼)也不起作用,因爲獲取需要在創建之後執行,這不會在調用numberOfRowsInSection之前發生(因爲此方法調用並因此重新創建NSFRC)。

所以,我在每次選擇新大學時將一個BOOL添加到名爲newFetchRequired的視圖中,該視圖設置爲YES。在NSFRC,上面的代碼應改爲:

if (fetchedResultsController != nil && !newFetchRequired) { 
     return fetchedResultsController; 
    } 
newFetchRequired = NO; 

的獲取,然後進行正確的(它調用並重新創建NSFRC):

[self.fetchedResultsController performFetch:&error]; 

我希望這可以幫助任何人在類似的情況。

感謝Ashley的替代建議。

0

您是否記得performFetch:

NSError *error; 
BOOL success = [fetchedResultsController performFetch:&error]; 
+0

謝謝阿什利。是的,我正在執行提取操作,但在numberOfRowsInSection中返回的行數是0. –

+0

可以記錄fetchRequest以確認它是否包含您期望的內容(並在此處發佈?) –

+0

提取請求顯示搜索項是零。 (NSFetchRequest:0x5a52dd0>(entity:Student; predicate:(university == nil); sortDescriptors :(( 「(stuName,ascending,compare :)」 )); batch size:20; type:NSManagedObjectResultType;)。 NSFRC創建時,大學是零。我如何獲得這個更新以使用選定的大學? –

0

我不知道你是否還在檢查這個,我不太確定我是否正確理解你的問題。但是你爲什麼要從頭開始創建NSFRC?這是我會怎麼做:

當一個新的大學選擇只添加正確的代碼有:

NSFetchRequest *fetchRequest = [self.fetchedResultsController fetchRequest]; 

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"university == %@",self.selectedUniversity]; 

[fetchRequest setPredicate:predicate]; 

NSError *error; 
[fetchedResultsController performFetch:&error]; 

就大功告成了。 (對不起,如果這完全不是你想要的)。

編輯:您也可以簡單地寫入一個私人函數,並在每次選擇大學時調用它。