【问题标题】:CoreData Relationship Validation Error handlingCoreData 关系验证错误处理
【发布时间】:2017-03-28 02:01:17
【问题描述】:

我在两个核心数据实体之间存在一对多关系。

如下A->>B

A ->> B : Delete Deny(即拒绝删除 A 而它们是 B 的对象)

B -> A : 无效

在多个上下文中,一个上下文不知道其他更改,因此在这种情况下,我在保存父上下文时遇到验证错误,因为在一个上下文中,一个子项被插入到另一个上下文中正在删除的父项中。

他们几乎没有提供关于如何处理验证错误的信息,大多数示例只是向用户显示错误并丢弃更改。如果我需要撤消删除该特定父对象,我可以吗?

是否有任何选项我可以处理验证错误。 NSValidationRelationshipDeniedDeleteError

【问题讨论】:

  • 您仍然可以使用 mergeChangesFromContextDidSaveNotification 跟踪其他情况下发生的情况

标签: ios core-data entity-relationship nsundomanager validationerror


【解决方案1】:

我没有找到一种方法来撤消仅对某个对象的删除而不会丢失更改。因此,如果您删除了childContext 中的父实体,然后保存了childContext,则删除的实体会自动添加到parentContext.deletedObjects。我尝试了不同的方法,但我能够从parentContext 取消删除操作的唯一方法是调用parentContext.refreshObject(deletedParent, mergeChanges: false)。 (当然你可以尝试回滚或重置上下文)

这真的取决于你要做什么(所以这里的业务影响很大!)。但我认为你应该乐观地工作:https://en.wikipedia.org/wiki/Optimistic_concurrency_control 有时,如果发生冲突,可以回滚并重新启动事务。

通常,childContext 会覆盖parentContext 的更改(孩子具有更高的优先级)。所以你的应用程序的架构应该以同样的方式工作。当您在childContext 中删除一个实体时,您也应该在parentContext 中删除它,即使拒绝规则因为您插入了一个新的子实体而阻止您。你应该做的是你应该删除插入的实体,然后删除父实体。否则,您应该重新研究应用程序的架构。

【讨论】:

    猜你喜欢
    • 2018-06-29
    • 2017-08-19
    • 2017-07-04
    • 1970-01-01
    • 1970-01-01
    • 2020-10-08
    • 2016-07-24
    • 2012-10-11
    • 1970-01-01
    相关资源
    最近更新 更多