如何在轻量级核心数据迁移之后为现有实体的新属性设置默认值?
我已经成功完成了我的核心数据模型的轻量级迁移。
我的自定义实体车辆接收到一个新属性'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迁移映射以确保迁移完全成功。