NSFetchedResultsControllerDelegate を実装する UITableViewController があります。の
- (NSFetchedResultsController *)fetchedResultsController
エンティティからレコードをロードしています。そのエンティティのレコードを更新すると、NSFetchedResultsChangeType が常に NSFetchedResultsChangeDelete になり、オブジェクトが削除されます。レコードを削除せずに更新しているので、更新するだけでよいと思います。
- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject atIndexPath:(NSIndexPath *)indexPath forChangeType:(NSFetchedResultsChangeType)type newIndexPath:(NSIndexPath *)newIndexPath {
UITableView *tableView = self.tableView;
switch(type) {
case NSFetchedResultsChangeInsert:
[tableView insertRowsAtIndexPaths:[NSArray arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeDelete:
NSLog(@"object deleted %d",
indexPath.row);
[tableView deleteRowsAtIndexPaths:[NSArray arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
case NSFetchedResultsChangeUpdate:
[self configureCell:[tableView cellForRowAtIndexPath:indexPath] atIndexPath:indexPath];
break;
case NSFetchedResultsChangeMove:
NSLog(@"object moved %d",
indexPath.row);
[tableView deleteRowsAtIndexPaths:[NSArray
arrayWithObject:indexPath] withRowAnimation:UITableViewRowAnimationFade];
[tableView insertRowsAtIndexPaths:[NSArray
arrayWithObject:newIndexPath] withRowAnimation:UITableViewRowAnimationFade];
break;
}}
編集1:
また、オブジェクトを最初に保存している間は挿入されていないようです。実際、その時点で didChangeObject は起動されていません。
編集2
詳細: 異なる述語に同じテーブルを使用します。分割ビューがあり、左右のビューは両方ともテーブル ビューです。左にいくつかのカテゴリを示し、左の選択に基づいて右にビューを構成します。構成は、最初にキャッシュを削除し、次に NSFetchedResultsController の述語を変更してから、それに対して performFetch を実行します。バックグラウンドで、選択したカテゴリの更新されたオブジェクトを見つけて、新しいオブジェクトを挿入するか、既存のオブジェクトを更新します。現在、新しいオブジェクトを追加してもテーブル ビューに自動的に表示されず、オブジェクトを更新すると削除が発生します。別の NSFetchedResultsController から左側のテーブル ビューのカテゴリを更新すると、正常に動作します。両方の NSFetchedResultsController は異なるキャッシュ ファイルを使用します。述語を変更しないと、すべてのカテゴリのオブジェクトですべてが正常に機能します。