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

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

我的自定义实体车辆接收到一个新属性'tirePressure',它是一个doubletypes的可选属性,默认值为0.00。

当“旧”车辆从商店(在迁移发生之前创build的车辆)获取时,其“轮胎压力”财产的价值为零。 (这是预期的行为?)

所以我想:“没问题,我只是在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'脏。

但他们没有。

每次这些车辆都从店里取出,“轮胎压力”尽pipe保存了上下文仍然是零。

6个月后我终于明白了。

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

您需要在awakeFromFetch使用setPrimativeValueForKey ,因为setPrimativeValueForKey使用的dynamic访问器尚未激活。

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