2011-04-19 15 views
0

我有一個關於NSFetchedResultController更新問題的問題。您可能已經知道,如果我獲取所有項目並設置NSFetchedResultController的委託,那麼如果數據已更改,控制器將捕獲更改並自動更新其對象。核心數據 - 如果我給NSPredicate和委託NSFetchedResultController會自動跟蹤更改

但是,如果我使用NSPredicate獲取項目,它不會捕獲任何更改或其對象。有人能告訴我爲什麼嗎?

以下是帶有NSPredicate集的代碼。

NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init]; 
    NSEntityDescription *entity = [NSEntityDescription entityForName:@"Person" inManagedObjectContext:self.globalContext]; 
    [fetchRequest setEntity:entity]; 
    [fetchRequest setFetchBatchSize:200]; 

    NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"Department" ascending:YES selector:nil]; 

    NSArray *descriptors = [NSArray arrayWithObjects:sortDescriptor, nil]; 
    [fetchRequest setSortDescriptors:descriptors]; 
    [sortDescriptor release]; 

    NSPredicate *pred = [NSPredicate predicateWithFormat:@"Department IN %@",departmentArray]; 
    [fetchRequest setPredicate:pred]; 

    self.resultsController = [[[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:self.globalContext sectionNameKeyPath:@"Department" cacheName:@"Root"] autorelease]; 
    self.resultsController.delegate = self; 

    [self.resultsController performFetch:nil]; 
    [fetchRequest release]; 

在代碼中,我設置了@「部門」作爲sectionNameKeyPath,而我只需要從一些部門(departmentArray)的「人」項目,並非所有部門。

如果我從NSFetchRequest中刪除了NSPredicate,那麼每次插入甚至是一個新部門的人員項目時,resultsController都會知道並觸發該委託。

但是,如果我保留NSPredicate,resultsController將無法知道任何更改。例如:

我的部門數組具有以下名稱:@「Sales」,@「Human Resources」。

最初,核心數據中沒有來自@「Sales」的人員。我做了一個訪問,然後只有來自@「人力資源」的人獲得了。

然後插入一個來自@「Sales」的人,我認爲resultsController應該會自動更新,對不對?因爲@「Sales」的新人適合NSPredicate,對嗎?

感謝

+0

順便說一句,我刪除所有緩存之前,我提取 – Jack 2011-04-19 09:55:54

回答

1

謂詞不是動態的謂詞已經創建後不會在departmentArray變化做出反應。就謂詞而言,departmentArray只包含Human Resources。此外,取出請求同樣是靜態的,即使謂詞確實發生了變化,取回請求也不會改變。

如果更改departmentArray,則需要爲獲取的結果控制器生成新的獲取請求。

+0

謝謝你,你是核心數據大師,你回答我的另一個核心數據問題 – Jack 2011-04-19 16:37:20