保存:在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]
上下文,并使用从UIManagedDocument
inheritance的下列类来添加自动保存日志:
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];