我在我的应用程序中使用核心数据。
我的问题是无论我是否在 NSManagedObjectContext
上调用 Save,实体 (NSManagedObject
) 都会保持其状态,唯一的条件是应用程序处于事件状态。当我终止应用程序并再次运行它时,所有实体都保留在最后一次调用“NSManagedObjectContext
上的Save
”之前所做的最后属性或更改。
例如。我有 OpenViewController
和 FormOpenViewController
。
FormOpenViewController
适用于 (Form *)
实体 (NSManagedObject
)。
OpenViewController
调用 FormOpenViewController
并从数据库中获取 (Form *)
对象并将其传递给 FormOpenViewController 的 (Form *)form
对象。
在 FormOpenViewController
的 viewDidLoad
中,我更改了 (Form *)form
的一个属性“editable
”的值> 反对“YES
”。
即FormOpenViewController.m
- (void)viewDidLoad
{
// changed the editable property of form to yes from no
if([formEditData.editable boolValue] == NO)
{
form.editable = [NSNumber numberWithBool:YES];
}
}
-(void)saveData
{
[[shareInstance delegate].managedObjectContext save:nil];
[shareInstance delegate].arrForder = [[ipegsClient shareInstance ] getLoginUser].folders.allObjects;
}
所以现在如果我返回 OpenViewController
而不调用 saveData
方法,然后再次进入 FormOpenViewController
然后控制不会进入 if
block ,这意味着它的表单对象现在具有“可编辑”属性,如“YES
”,应该是“NO
”,因为直到我还没有“saveData
函数”。
更新:
每次调用或显示它时,我都会创建 FormOpenViewController
的新实例。并且在每次调用 FormOpenViewController
之前从数据库中获取新的 (Form *) form
对象。
编辑:
在 applicationWillTerminate 中调用以下函数:
- (void)saveContext
{
NSError *error = nil;
NSManagedObjectContext *managedObjectContext = self.managedObjectContext;
if (managedObjectContext != nil) {
if ([managedObjectContext hasChanges] && ![managedObjectContext save:&error]) {
// Replace this implementation with code to handle the error appropriately.
// abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
abort();
}
}
}
有人知道为什么会这样吗?
提前致谢。如果我在某处出错,请纠正我。
最佳答案
这就是核心数据的工作原理。
将托管对象上下文视为您所做的任何更改的内存暂存器。当您更改对象时,只要您使用该上下文,该更改就是“真实的”。
如果您保存上下文,这些更改将写入下一级,即父上下文或您在磁盘上的持久存储。
如果您在不保存的情况下销毁上下文,这些更改将丢失。
如果您想恢复或撤消在特定 session 期间所做的更改,那么最简单的方法是创建一个子上下文并将其传递给您的编辑 View Controller 。如果您随后“取消”编辑 View Controller ,只需销毁子上下文,您的更改就会丢失。否则,保存上下文,它们将传递到主上下文。
因此,在不保存上下文的情况下终止应用程序意味着您下次启动时,上下文是根据持久存储中的数据构建的,其中没有写入您的更改。
关于ios - 无论是否在托管上下文 iOS 上调用保存,Core Data 中的实体是否会保留其状态?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/26988735/