【问题标题】:Core Data: Re-assign parent entity核心数据:重新分配父实体
【发布时间】:2015-05-12 00:42:24
【问题描述】:

使用 Core Data,重新分配父实体的正确方法是什么?

我有一个Car 实体,它与车轮具有一对多关系并且被级联删除(如果汽车被删除,它的所有车轮也被删除)。每个轮子只能有一个Car 父级。如何将车轮重新分配给不同的汽车?

例如: Car-A 有 Wheel1、Wheel2、Wheel3、Wheel4 作为其子项。 我想将 Wheel1、Wheel2、Wheel3、Wheel4 移动到名为 Car-B 的新父级。

这是我所做的:

for (Wheel *wheel in carA.wheels) {
   wheel.car = carB;
}

但是,上面会抛出错误:

*** Terminating app due to uncaught exception 'NSGenericException', reason: '*** Collection <_NSFaultingMutableSet: 0x7fe0537dd2b0> was mutated while being enumerated.'

除了抛出错误之外,我还觉得像上面那样简单地重新分配父实体不是正确的方法。

任何建议将不胜感激。谢谢。

【问题讨论】:

    标签: ios objective-c core-data


    【解决方案1】:

    您在for-loop 中直接改变集合,这会导致错误。假设集合是NSMutableSet,正确的做法是:

    NSArray* wheels = [carA.wheels allObjects];
    for (NSManagedObject* wheel in wheels)
    {
        [carA removeObject:wheel]
        [carB addObject:wheel]
    }
    

    【讨论】:

    • 谢谢 Sebastian,我忘记了这两个方便的方法。
    • 此方法似乎不适用于 iCloud 无处不在的持久存储。我在核心数据上试过这个并且它有效,但它并没有无处不在。知道为什么吗?
    • 您是否遇到了一些错误,或者它根本不起作用?
    【解决方案2】:

    您不能改变正在枚举的集合。如果你仔细想想,这必然导致问题是很合乎逻辑的。

    解决方案是先将项目分开。

    NSSet *wheels = carA.wheels
    carA.wheels = nil;
    for (Wheel *wheel in wheels) {
      wheel.car = carB;
    }
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2011-10-18
      • 1970-01-01
      相关资源
      最近更新 更多