iOS - 核心数据 - NSManagedObjectContext - 不确定是不是保存

Posted

技术标签:

【中文标题】iOS - 核心数据 - NSManagedObjectContext - 不确定是不是保存【英文标题】:iOS - Core data - NSManagedObjectContext - not sure if it is savediOS - 核心数据 - NSManagedObjectContext - 不确定是否保存 【发布时间】:2012-04-17 03:19:04 【问题描述】:

概述

我有一个使用核心数据的 ios 项目 我正在插入一个对象,然后我想保存它。 我不确定保存是否有效。 当应用进入后台时,Save 似乎正在工作 使用模拟器时,如果我点击 Xcode 上的停止按钮,保存似乎不起作用。

问题

    保存是否真的发生了? 我是否因为创建了一个基于视图的应用程序而面临问题(核心数据复选框不可用)?

遵循的步骤

我正在使用模拟器进行测试。 插入一个对象(代码在下一节) 保存插入的对象(代码在下一节) 我按下 Xcode 上的停止按钮停止运行应用程序

注意到输出

setBeforeSave.count = 1
setAfterSave.count = 0
保存前NSManagedObjectContext方法insertedObjects返回1个对象 保存前NSManagedObjectContext方法insertedObjects返回0个对象 当按下Xcode停止按钮时,当重新启动应用程序时,之前的数据不可用(是不是因为我在xcode上点击了停止) managedObjectContext 不为零 NSManagedObjectContext 方法save: 返回YES

插入对象的代码

Test *test = [NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:self.database.managedObjectContext];

要保存的代码:

//database is a property of the type UIManagedDocument

NSSet *setBeforeSave = [self.database.managedObjectContext insertedObjects];
NSLog(@"setBeforeSave.count = %i", setBeforeSave.count);

NSError *error = nil;

if(![self.database.managedObjectContext save:&error])
    NSLog(@"error = %@", error);    

NSSet *setAfterSave = [self.database.managedObjectContext insertedObjects];
NSLog(@"setAfterSave.count = %i", setAfterSave.count);

【问题讨论】:

【参考方案1】:

根据 UIManagedDocument 文档,您不应在任何内部托管上下文中调用 save。相反,如果您想保存数据,您应该做以下两件事之一。

    使用 undoManager,因为它会将上下文标记为脏,并准备好保存。

    调用[文档updateChangeCount:UIDocumentChangeDone];

因此,在您的情况下,您应该将该保存调用替换为:

[self.database updateChangeCount:UIDocumentChangeDone];

您的数据将被保存。

编辑

提供更多细节。 UIManagedDocument 有两个 MOC。在父/子关系中。孩子是您在调用 document.managedObjectContext 时得到的那个。现在,当 NSManagedObjectContext 有父对象时,将更改传播到父对象的正常方法是调用 save:。但是,UIManagedDocuememt 做了其他事情,并且它的文档明确指出不要在父上下文或子上下文中调用 save。

那么,如何保存东西呢?好吧,您告诉 UIManagedDocument 它是“脏的”并且需要保存。有两种方法可以做到这一点,要么使用 undoManager,要么调用 updateChangeCount:。

当执行上述任一操作时,UIManagedDocument 的内部将确保通知父上下文有关更改。在未来的某个时候,父级将影响对实际后备存储(即磁盘上的文件)的更改。

此外,当“保存”上下文时,它可能会或可能不会保留对已更改对象的引用。您可以设置一个属性,告诉它保留已保存的对象或释放它们。

希望这能解决您的问题。

不过,总结一下,请参阅原始答案。

顺便说一句,您实际上可以通过在命令行参数中添加“-com.apple.CoreData.SQLDebug 1”来查看 SQL 存储在下面执行的操作的日志。您可以在“编辑方案”对话框中执行此操作。

【讨论】:

感谢乔迪,但它似乎不起作用,我正在使用以下插入记录 [NSEntityDescription insertNewObjectForEntityForName:@"Test" inManagedObjectContext:self.database.managedObjectContext]; 我是否面临问题,因为我创建了一个基于视图的应用程序(核心数据复选框不可用)? 乔迪,我重新编辑了问题,你能看一下吗 你还是做错了。使用 UIManagedDocument 时不要调用“保存”。我将编辑答案以提供更多详细信息。 非常感谢乔迪!!,答案非常有帮助,并澄清了我对 managedObjectContext(父/子线程)的困惑。

以上是关于iOS - 核心数据 - NSManagedObjectContext - 不确定是不是保存的主要内容,如果未能解决你的问题,请参考以下文章

要保存在服务器中的核心数据的唯一 ID

iOS - 在同一个项目中使用 Swift 和 Objective c?

Xcode 没有生成正确的 coredata 模型文件

iOS - 核心数据 - 完成处理程序

iOS - 数据保存一次到核心数据中

iOS核心数据损坏?