2010-04-15 28 views
4

我有一個從CoreDataBook示例開始的標準方式的- (NSFetchedResultsController *)fetchedResultsController內的謂詞。NSPredicate導致更新編輯返回NSFetchedResultsChangeDelete不NSFetchedResultsChangeUpdate

NSPredicate *predicate = [NSPredicate predicateWithFormat:@"state=%@ && date >= %@ && date < %@", @"1",fromDate,toDate]; 
    [fetchRequest setPredicate:predicate]; 

這工作正常,但是當編輯一個項目,它返回與NSFetchedResultsChangeDelete不更新。當主視圖返回時,它缺少該項目。如果我重新啓動模擬器,刪除不會被保存,並且顯示正確的編輯結果謂詞正常工作。

case NSFetchedResultsChangeDelete: 
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade]; 
break; 

我可以證實通過註釋掉兩個謂語線ONLY,然後所有的作品,因爲它應該擁有整套編輯後返回正確,並呼籲NSFetchedResultsChangeUpdate代替NSFetchedResultsChangeDelete行爲。

我已閱讀http://matteocaldari.it/2009/11/multiple-contexts-controllers-delegates-and-coredata-bug 誰報告類似的行爲,但我還沒有找到解決我的問題的工作。

回答

0

您是否在使用多個NSManagedObjectContext?您鏈接的帖子使用了多個不正確的NSManagedObjectContext實例,這是他的問題的根源。這不是NSFetchedResultsController中的一個錯誤,而是他對於它如何工作的誤解。

關於你的問題;第一個問題:在你展示的那個之前你有沒有休息過case

編輯代碼是什麼樣的?您顯示一個謂詞,但不顯示正在編輯您聲明的對象的代碼,該對象會導致NSFetchedResultsChangeDelete觸發。

0

在我的文章中,我(見https://devforums.apple.com/message/139580#139580),它確實在兩個不同的管理對象上下文兩個對象之間的指針比較,而不是評估objectID處理的是一個已知的bug在NSFetchedResultsController,所以我覺得這是不是你的問題。

僅當在NSPredicate中指定的時間間隔之外修改其date或其他任何修改時,您的對象是否被視爲已刪除?

1

對不起,已經有一段時間了,我很快就會發布產品。周圍的工作是使在所獲取的對象存儲過程和使用

NSFetchRequest *fetch = [model fetchRequestFromTemplateWithName:@"myTemplate1" substitutionVariables:subs]; 

這消除了FetchedResultsController使用謂語。

當我想使用謂詞時,我只需確保我使用的是本地managedObjectContext並將Array本身傳遞給其他地方。 NSArray *array = [moc executeFetchRequest:fetchRequest error:&error]; return array;

這是一個更安全的賭注,可以讓您對同一數據進行多次查看。

+0

非常感謝。這節省了我的一天! :) – Daniel 2013-08-30 11:21:00

5

我也遇到過這個問題。根本原因是由於NSPredicate格式字符串中屬性值的類型設置錯誤造成的。

對於此問題可能是「state」的屬性具有數字類型,如「Integer 32」。但是上面的代碼通過了一個NSString(@"1"),只是將其更改爲NSNumber(@1),將解決問題。

Matthew Weiss終於通過使用獲取請求模板解決了這個問題。我認爲在沒有類型問題的模板中檢查了「state」。只有從日期和toDate通過subs。

+0

它節省了我的一天,謝謝,我的代碼在iOS <6中運行良好,但現在它在iOS 7中創建問題 – 2014-08-13 08:55:03