我已成功完成核心数据模型的轻量级迁移。
我的自定义实体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'标记为脏。
但他们没有。
每次这些车辆从商店取出'轮胎压力'仍然是零,尽管已经保存了背景。
答案 0 :(得分:79)
我终于在6个月后弄明白了。
添加到核心数据实体的属性必须标记为非可选。 只有这样,在使用旧数据模型创建的实体的轻量级迁移期间,才会自动设置默认值。
答案 1 :(得分:1)
您需要在setPrimativeValueForKey
中使用awakeFromFetch
,因为self.propertyName
使用的动态访问者尚未激活。
但是,由于默认值没有出现在第一位,这表明您的迁移失败了。您可能需要创建迁移映射以确保迁移完全成功。