保存:在NSManagedObjectContext不工作

在导航控制器中,我从视图控制器1转到视图控制器2。

视图控制器1是绑定到FetchedResultsController的表视图控制器。 它从特定的上下文中获取数据并显示它。 然后我继续查看控制器2,如果一行被挖掘。 在继续时,我使用视图控制器1中的数据来设置视图控制器2的特定NSManagedObject属性。

现在,在视图控制器2中,我可以使用NSManagedObject属性显示数据,然后对其进行更改并执行保存: 当我回到查看控制器1时,变化被反映出来。 但是,如果我重新启动应用程序,则不会在任何视图控制器中反映出来。

这是我如何做保存。

- (void)hiddenAttributeSwitchSlid:(UISwitch *)sender { [self.workoutType.managedObjectContext performBlock:^{ self.workoutType.workoutHiddenByDefault = [NSNumber numberWithBool:sender.isOn]; NSError *error = nil; if (![self.workoutType.managedObjectContext save:&error]) { NSLog(@"There was an error in saving to context - %@", [error localizedDescription]); } else { NSLog(@"No error"); } }]; } 

workoutType是在prepareForSegue中设置的NSManagedObject:在inheritance这个视图控制器之前。

即使我不使用performBlock:,它不起作用。

PS – 我知道这种问题之前已经被问过了。 我浏览了他们,但似乎没有任何工作。

你在模型中为该属性设置了默认值吗?

核心数据中存在一个确定的错误,在某些情况下(我没有完全缩小),在应用程序的后台处理过程中,具有默认值的属性多次被重置。

testing的方法是监听通过KVO更改的值并logging更改,然后复制您的testing。 如果你看到几个变化,那么你知道你正在碰到这个错误。

我已经看到的唯一已知的解决scheme是可靠的是删除默认值。 如果需要默认值,那么我将它添加到-awakeFromInsert方法中的NSManagedObject子类,然后更新validation方法来检查它。 吮吸我知道。

更新#2

你有多less上下文?

你正在使用父子上下文吗?

如果是这样,你是保存最顶级的父母?

更新#3

好吧,一个UIManagedDocument有两个NSManagedObjectContext实例。 是否有你使用UIManagedDocument的原因? 你的应用程序中是否有多个文件? 如果你不这样做,我强烈build议你切换回传统的核心数据栈。 UIManagedDocument实际上并不意味着在一个单独的堆栈应用程序中。

至于直接保存问题, UIManagedDocument尝试在退出应用程序时保存在后台。 如果可以花一点时间,并且不是很可靠。 您可以要求退出保存,这将有助于确保保存速度,但即使如此,它可能是不可靠的。

你怎么退出应用程序?

你在Xcode中杀死它吗?

你在背景中,然后恢复?

你是否在背景中,然后从iOS设备中杀死它?

您可以侦听UIManagedDocument以保存并打印日志语句,以便您可以查看实际发生的磁盘保存情况。 这可能是有用的,以帮助缩小到什么时候,而不是保存。

我认为你不应该使用上下文保存,文件将自动保存。

保存文档时可能会出现数据一致性错误。 我build议你不要使用[self.workoutType.managedObjectContext save:&error]上下文,并使用从UIManagedDocumentinheritance的下列类来添加自动保存日志:

LoggingManagedDocument.h:

 @interface LoggingManagedDocument : UIManagedDocument @end 

LoggingManagedDocument.m:

 #import "LoggingManagedDocument.h" @implementation LoggingManagedDocument - (id)contentsForType:(NSString *)typeName error:(NSError *__autoreleasing *)outError { NSLog(@"Auto-Saving Document"); return [super contentsForType:typeName error:outError]; } - (void)handleError:(NSError *)error userInteractionPermitted:(BOOL)userInteractionPermitted { NSLog(@"error: %@ userInfo: %@", error, error.userInfo); } @end 

这个class级应该帮助你确定问题,为什么你的数据没有保存。 只要让应用程序运行,并在更改属性后等待15到30秒,应该进行自动保存。

日志logging基于: http : //blog.stevex.net/2011/12/uimanageddocument-autosave-troubleshooting/

从UIManageDocument文档:

UIManagedDocument体系结构导致几个注意事项:

您通常应该使用标准的UIDocument方法来保存文档。 如果直接保存子上下文,则只能将更改提交到父上下文,而不提交到文档存储。 如果直接保存父上下文,则会回避文档执行的其他重要操作。

最简单的select是使用保存模型,这意味着使用文档的NSUndoManager。 我通常这样做

 [self.workoutType.managedObjectContext.undoManager beginUndoGrouping]; 

在添加更改之前

 [self.workoutType.managedObjectContext.undoManager endUndoGrouping]; 

编辑后。

您需要保存文档:

 [document saveToURL:document.fileURL forSaveOperation:UIDocumentSaveForOverwriting completionHandler:NULL];