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

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

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

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

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

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

感谢任何解释或建议。

更新

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

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

【问题讨论】:

    标签: cocoa-touch core-data io nsmanagedobject


    【解决方案1】:

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

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

    【讨论】:

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