2012-03-14 47 views
6

我正在使用NSFetchedResultsController来填充和管理我的表格数据源。如果我更改某些属性,是否需要手动保存managedObjectContext for NSFetchedResultsController?

当用户选择一个特定行,一个actionsheet弹出,然后让用户改变的值该行:

NSManagedObject *managedObject = [fetchedResultsController objectAtIndexPath:selectedRowIndexPath]; 
[managedObject setValue:status forKey:@"status"]; 

这个作品真的很好,我可以马上看到tableview中的变化。这意味着NSFetchedResultsController知道某些内容已更改,因此会重新加载该tableviewcell。当我停止并退出我的应用程序(完全)然后重新打开它时,更改不会被保存。

我会认为NSFetchedResultsConroller负责保存更改。

每次更改后,是否需要使用以下代码手动保存?

// Save the context. 
NSError *error = nil; 
if (![self.managedObjectContext save:&error]) { 
    NSLog(@"Unresolved error %@, %@", error, [error userInfo]); 
    abort(); 
} 

或者,也许把这个代码:

- (void)controller:(NSFetchedResultsController *)controller didChangeObject:(id)anObject 
     atIndexPath:(NSIndexPath *)indexPath 
    forChangeType:(NSFetchedResultsChangeType)type 
     newIndexPath:(NSIndexPath *)newIndexPath 

回答

6

你是正确的。您需要手动将上下文保存到商店。 NSFetchedResultsController从上下文中获取数据,但不会将数据保存到存储中。

+0

因此,在'didChangeObject'委托方法内部保存并不是一个坏主意? – Pieter 2012-03-14 12:59:57

+1

如果你这样做了,你可能会出现循环风险。 NSFetchedResultsController委托方法用于更新视图,而不是模型。所以无论何时保存到上下文中,视图都会相应地更新(基本上,这样您就不必重新加载表视图)。如果要在委托方法中保存上下文,委托方法将继续触发,因为它会注意到上下文中的更改。 – Gobot 2012-03-14 13:05:14

+0

那么解决方案是什么? – fatuhoku 2014-04-04 23:19:05

相关问题