了解核心数据并在删除后保存 NSManagedObjectContext

Posted

技术标签:

【中文标题】了解核心数据并在删除后保存 NSManagedObjectContext【英文标题】:Understanding Core Data and Saving an NSManagedObjectContext after a deletion 【发布时间】:2012-04-13 13:31:06 【问题描述】:

我有一个核心数据生成类“item”。它有一个 'type' 属性,它是另一个类。

我已经自定义了“setType”,以便进行一些其他处理 - 例如,我更新了“dateTypeLastSet”。到目前为止一切正常。

但是,由于某种原因,当我删除该项目时,也会发生这种额外的处理。具体来说,直到我在 NSManagedObjectContext 上调用“保存”时才会发生这种情况。

这是因为删除导致自动调用“setType:nil”吗?记录参数表明 NULL 是尝试的分配。

这对我来说是个问题,因为在我的附加处理代码中,我执行了一些计算。假设我在其中存储了一些“设置项目类型的次数”的计数器。我不希望删除和设置为 nil 被计算在内。但我也不能只检查 nil,因为这可能是一个合法的更新(nil 作为一种类型可能是可以接受的)。

感谢任何解释或建议。

更新

事实证明,当类型被删除时,它确实将该属性设置为 nil - 我注意到数据实体的删除规则默认为无效。如果改成无动作,我就没有这个问题了。

所以现在的问题变成了 - 将删除规则从 nullify 更改为其他影响是什么?为什么这被视为合理的默认值?

【问题讨论】:

【参考方案1】:

似乎 nullify 是一个合理的默认值,因为一旦“类型”不再存在,有一个指向它的流浪指针可能是危险的。如果您在文档中查找 NSNoActionDeleteRule,它会说:

“如果您使用此规则,您有责任维护 对象图的完整性。强烈建议不要使用此规则 除了高级用户之外的所有用户。”

【讨论】:

那我就是不明白怎么可能在我的 setType 方法中有自定义代码,因为当我删除项目时它总是会被调用。 我猜这取决于 nil 作为显式设置和 nil 作为系统需要使用的值之间的区别。您能否定义一个为空值的“类型”对象并将其用于显式 setType:? ...使用 NSNull 的方式是什么? 我可以。我猜我只是觉得恶心。 另一种思考方式是,如果没有Core Data,您希望发生什么。对象 x 对对象 y 的引用很弱,并且 y 被解除分配...? 你说得对,我希望它为零。我猜这个问题仅特定于 setter 中的自定义代码,该属性与它设置的属性同名,如果这有任何意义的话。例如,如果我的自定义代码都在一个名为 setTheType: 而不是 setType: 的方法中,并且我确保在我的代码中始终使用 setTheType:,那么 setType: 将恢复为纯粹设置原语,这就是我当项目被删除时发生。如果在数据实体上我将类型属性命名为 TypeCoreData 之类的,则可以实现相同的效果。不过有点难看。

以上是关于了解核心数据并在删除后保存 NSManagedObjectContext的主要内容,如果未能解决你的问题,请参考以下文章

核心数据关系在删除后导致保存错误

删除后尝试保存时核心数据崩溃

iOS - 核心数据 - 在 NSManagedObject 子类中使用删除方法后保存不成功

NSUndoManager 检测核心数据实体的实际删除

如何在 Swift 中将可转换属性保存到 Core Data

UITableViewCell 图像 + 保存到核心数据