【问题标题】:Coredata delete rule confusion, xcodeCoredata删除规则混乱,xcode
【发布时间】:2011-11-01 07:56:57
【问题描述】:

我有两个实体之间的 Core Data 关系,是这样的:

Entity A                        Entity B
aRelationship <-------------->> bRelationship

删除规则设置为级联。

也许我有这个错误,但我认为如果这两个关系的删除规则都设置为“级联”,那么以下什么时候...

[context deleteObject:EntityA];

...它还会删除所有与之关联的实体 B。但是,当我记录所有实体 B 时,似乎我错了。

有人能解释一下我的困惑吗?

非常感谢。

【问题讨论】:

    标签: iphone objective-c ios xcode core-data


    【解决方案1】:

    虽然在图形数据模型编辑器中不会立即显示每个相互关系,即每个

    <--> 
    

    ...实际上是两个独立的关系,每个关系都有自己的删除规则。当具有删除规则的实体的对象被删除时,删除规则被激活。

    因此,如果在数据模型编辑器中有两个实体 AlphaBeta 具有关系:

    Alpha.betas<-->>Beta.alpha
    

    ……那么你真的有两个这样的关系:

    Alpha.betas--(delete rule)-->>Beta.alpha
    Beta.alpha--(delete rule)-->Alpha.betas
    

    从不想要设置这样的删除规则:

    Alpha.betas--(cascade)-->>Beta.alpha
    Beta.alpha--(cascade)-->Alpha.betas
    

    ... 因为删除任何一个Beta 实例都会删除关联的Alpha 对象,这将触发删除所有相关的Beta 对象。根据您的数据模型的详细信息,互惠级联可能会意外删除大量数据。

    你真正想要的是:

    Alpha.betas--(cascade)-->>Beta.alpha
    Beta.alpha--(nullify)-->Alpha.betas
    

    现在,当您删除 Alpha 对象时,它将删除所有关联的 Beta 对象。

    当级联被阻塞时,通常是所需关系出现问题。如果没有数据模型的详细信息,无法确定。

    【讨论】:

    • 快速提问,当我运行[context deleteObject:EntityA]; 时,这将确保正确删除所有测试版,如果我按照您在最后一段代码中的设置进行设置?
    • 假设没有其他东西阻止删除。
    • 但是如果我删除所有的 Beta 会怎样?这种情况下如何让Alpha自动删除?
    • 只是一个想法:为关系设置最小值 1,最后一个测试版的删除将失败。通过删除相关的 Alpha 来处理错误。不确定它是否可以这样工作。
    • 现在,当您删除 Alpha 对象时,它会删除所有关联的 Beta 对象。但是假设我不想删除 Beta 对象,如果它与另一个对象相关联。这怎么可能??
    【解决方案2】:

    这取决于您使用的删除规则。

    这是 Apple 在他们的文档中所说的:

    "当你删除一个托管对象时,重要的是要考虑它的 关系,特别是为 关系。如果一个托管对象的所有关系删除规则 是 Nullify,那么对于该对象至少没有额外的工作 做(你可能需要考虑其他对象在 关系的目的地——如果反向关系是 强制性或对基数有下限,然后是目的地 一个或多个对象可能处于无效状态)。如果有关系 删除规则是级联的,那么删除一个对象可能会导致 删除他人。如果规则为拒绝,则在您删除一个 对象,您必须从 关系,否则保存时会出现验证错误。 如果删除规则是无操作,那么您必须确保您采取 确保对象完整性所需的任何步骤 图表。”

    “关系删除规则”链接:http://developer.apple.com/library/mac/#documentation/Cocoa/Conceptual/CoreData/Articles/cdRelationships.html#//apple_ref/doc/uid/TP40001857-SW1

    【讨论】:

      猜你喜欢
      • 2017-03-13
      • 1970-01-01
      • 2011-02-19
      • 1970-01-01
      • 2020-07-09
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2020-09-28
      相关资源
      最近更新 更多