为什么要更改Core Data中发送NSFetchedResultsChangeDelete事件的记录?

时间:2012-05-05 16:46:18

标签: objective-c ios cocoa core-data

我有一个UITableViewController,它实现了NSFetchedResultsControllerDelegate。在

- (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都使用不同的缓存文件。如果我不改变谓词那么一切都适用于所有类别的对象。谓词是从所选类别中获取记录。

1 个答案:

答案 0 :(得分:0)

我遇到了同样的问题。这就是我修复的方法:

  1. 我的谓词正在使用(" index ==%@")
  2. 我正在过滤一个整数值,但我正在传递@" 1"。
  3. 将其更改为%i并传递整数,工作。