繁体   English   中英

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

[英]How do I set default values on new properties for existing entities after light weight core data migration?

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

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

当从商店中获取“旧”车辆(在迁移发生之前创建的车辆)时,其“轮胎压力”属性的值为 nil。 (这是预期的行为吗?)

所以我想:“没问题,我会在车辆 class 中执行此操作:”

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

由于“更改处理被明确禁用” awakeFromFetch我认为对 willChangeValueForKey 和 didChangeValueForKey 的调用会将“tirePresure”标记为脏。

但他们没有。

每次从商店中获取这些车辆时,“tirePressure”仍然为零,尽管已保存上下文。

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

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

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

但是,由于默认值首先没有出现,这表明您的迁移详细失败。 您可能需要创建迁移 map 以确保迁移完全成功。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM