如果我更改某些属性,是不是需要手动保存 NSFetchedResultsController 的 managedObjectContext?

Posted

技术标签:

【中文标题】如果我更改某些属性,是不是需要手动保存 NSFetchedResultsController 的 managedObjectContext?【英文标题】:Do I manually need to save the managedObjectContext for NSFetchedResultsController if I change some attribute?如果我更改某些属性,是否需要手动保存 NSFetchedResultsController 的 managedObjectContext? 【发布时间】:2012-03-14 12:38:43 【问题描述】:

我正在使用 NSFetchedResultsController 来填充和管理我的表数据源。

当用户选择某一行时,会弹出一个操作表,然后让用户更改该行的值:

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

【问题讨论】:

【参考方案1】:

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

【讨论】:

那么保存在 'didChangeObject' 委托方法中是不是一个坏主意? 如果你这样做,你可能会冒循环的风险。 NSFetchedResultsController 委托方法用于更新视图,而不是模型。因此,只要将某些内容保存到上下文中,视图就会相应地更新(基本上这样您就不必不断重新加载表格视图)。如果您要在委托方法中保存到上下文,则委托方法将继续触发,因为它会注意到上下文的变化。 那么解决办法是什么?

以上是关于如果我更改某些属性,是不是需要手动保存 NSFetchedResultsController 的 managedObjectContext?的主要内容,如果未能解决你的问题,请参考以下文章

提示用户保存表单

为啥按钮只会在手动更改输入后更改对象属性?

Rails - 模型不通过方法保存属性,但如果手动分配(在控制台中)

动态更改 Apache 服务器端口(不是手动,通过编程)

如何设置TextBox空字符串的默认值而不是null

将更改保存到Forge Autodesk Viewer