ios - 无论是否在托管上下文 iOS 上调用保存,Core Data 中的实体是否会保留其状态?

标签 ios objective-c iphone xcode core-data

我在我的应用程序中使用核心数据。

我的问题是无论我是否在 NSManagedObjectContext 上调用 Save,实体 (NSManagedObject) 都会保持其状态,唯一的条件是应用程序处于事件状态。当我终止应用程序并再次运行它时,所有实体都保留在最后一次调用“NSManagedObjectContext 上的Save”之前所做的最后属性或更改。

例如。我有 OpenViewControllerFormOpenViewController

FormOpenViewController 适用于 (Form *) 实体 (NSManagedObject)。

OpenViewController 调用 FormOpenViewController 并从数据库中获取 (Form *) 对象并将其传递给 FormOpenViewController 的 (Form *)form 对象。

FormOpenViewControllerviewDidLoad 中,我更改了 (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/

相关文章:

ios - Firebase FCM主题-可以是已订阅用户的用户ID吗?

ios - 征求错误报告可以吗?

ios - UITableViewCell 中的 Size 类自定义

ios - 如何在 iOS 的 TableView 中使用 AdMob 横幅广告?

iphone - pageviewcontroller 中的 PageCurlEffect 与工具栏重叠

iPhone - 在远程推送通知对话框中查看/关闭按钮本地化

ios - GPUImageFilter 单例断言失败(useNextFrameForImageCapture)

iPhone View 分层

objective-c - 删除UIView底部的灰色条

iphone - 如何在 iPhone 的单个 UILabel 中创建粗体和普通字体文本?