在轻量级核心数据迁移后,如何为现有实体的新属性设置默认值?

时间:2011-05-03 09:07:59

标签: iphone ios core-data core-data-migration

我已成功完成核心数据模型的轻量级迁移。

我的自定义实体Vehicle收到了一个新属性'tirePressure',它是double类型的可选属性,默认值为0.00。

当从商店取出“旧”车辆(在迁移发生之前创建的车辆)时,他们的'tirePressure'属性的值为零。 (这是预期的行为吗?)

所以我想:“没问题,我只会在Vehicle类中这样做:”

- (void)awakeFromFetch {
    [super awakeFromFetch];
    if (nil == self.tirePressure) {
        [self willChangeValueForKey:@"tirePressure"];
        self.tirePressure = [NSNumber numberWithDouble:0.0];
        [self didChangeValueForKey:@"tirePressure"];
    }
  }

由于“围绕” awakeFromFetch显式禁用了更改处理,我认为对willChangeValueForKey和didChangeValueForKey的调用会将'tirePresure'标记为脏。

但他们没有。

每次这些车辆从商店取出'轮胎压力'仍然是零,尽管已经保存了背景。

2 个答案:

答案 0 :(得分:79)

我终于在6个月后弄明白了。

添加到核心数据实体的属性必须标记为非可选。 只有这样,在使用旧数据模型创建的实体的轻量级迁移期间,才会自动设置默认值。

答案 1 :(得分:1)

您需要在setPrimativeValueForKey中使用awakeFromFetch,因为self.propertyName使用的动态访问者尚未激活。

但是,由于默认值没有出现在第一位,这表明您的迁移失败了。您可能需要创建迁移映射以确保迁移完全成功。