32

我正在一個屏幕上寫兩個表的應用程序。左表是文件夾列表,右表顯示文件列表。當點擊左側的一行時,右側的表格將顯示屬於該文件夾的文件。NSFetchedResultsController:更改謂詞不起作用?

我正在使用Core Data進行存儲。選擇文件夾更改時,右表的NSFetchedResultsController的提取謂詞將更改並執行新的提取,然後重新加載表數據。我用下面的代碼片段:

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"list = %@",self.list]; 
[fetchedResultsController.fetchRequest setPredicate:predicate]; 
NSError *error = nil; 
if (![[self fetchedResultsController] performFetch:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 
[table reloadData]; 

然而,取結果仍然是相同的。我在抓取之前和之後都使用了NSLog的「謂詞」,並且他們對更新的信息是正確的。提取結果與初始提取保持相同(加載視圖時)。我不是很熟悉核心數據獲取對象的方式(是否有緩存系統?),但我之前做過類似的事情(更改謂詞,重新獲取數據和刷新表格)與單個表意見和一切進展順利。

如果有人能給我一個提示,我會非常感激。

在此先感謝。

回答

55

我幾乎正是這個問題,直到我發現了一絲非常最近的一篇博客在iphone incubator

NSFetchedResultsController是緩存的第一批成果。 (你可能有一些設置initWithFetchRequest:managedObjectContext:sectionNameKeyPath:cacheName)

我猜你的代碼(像我的)是一個派生的CoreData示例,所以假設它是@「根」,在你改變謂詞之前,做一個

[NSFetchedResultsController deleteCacheWithName:@"Root"]; 
+0

它的工作。謝謝! – 2010-03-23 10:09:53

+0

謝謝,這也解決了我的問題。雖然我沒有得到相同的結果,但我在iOS 3.2/4.0中遇到了崩潰。它雖然在3.1工作正常! – 2010-06-22 17:36:21

+1

請注意,實體高速緩存保留_across應用程序runs_。我有一個非常混亂的時間,試圖找出爲什麼在源代碼中更改謂詞本身對重建和運行應用程序沒有任何影響。 Apple說:「如果它找到一個具有相同名稱的緩存,控制器會測試緩存以確定它的內容是否仍然有效。控制器比較當前實體名稱,實體版本哈希,排序描述符和節鍵路徑與那些存儲在緩存中「。請注意,該列表中的謂詞不包含**。 – aroth 2014-04-28 00:57:37

1

在我的情況下,deafgreatdane的答案是行不通的;我做了什麼,而不是可能是幼稚,但工作原理:

  • 創建於configureCell:atIndexPath:方法(稱爲tableView:cellForRowAtIndexPath:)的相應謂詞(S)
  • 然後調用:
    [_fetchedResultsController.fetchRequest setPredicate:predicate];
    [_fetchedResultsController performFetch:nil];
  • 參考通過致電[self.fetchedResultsController objectAtIndexPath:indexPath]
1

這工作對我來說:

[NSFetchedResultsController deleteCacheWithName:nil]; 
[self.fetchedResultsController.fetchRequest setPredicate:predicate]; 

NSError *error = nil; 
if (![self.fetchedResultsController performFetch:&error]) { 
    NSLog(@"%@, %@", error, [error userInfo]); 
    abort(); 
} 
相關問題