Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/iphone/36.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/112.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Iphone 在轻量级核心数据迁移之后,如何为现有实体的新属性设置默认值?_Iphone_Ios_Core Data_Core Data Migration - Fatal编程技术网

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

Iphone 在轻量级核心数据迁移之后,如何为现有实体的新属性设置默认值?,iphone,ios,core-data,core-data-migration,Iphone,Ios,Core Data,Core Data Migration,我已经成功地在我的核心数据模型上完成了轻量级迁移 我的自定义实体车辆收到一个新属性“tirePressure”,它是一个可选属性,类型为double,默认值为0.00 当从存储中提取“旧”车辆(迁移之前创建的车辆)时,其“tirePressure”属性的值为零。(这是预期的行为吗?) 所以我想:“没问题,我会在车辆类中这样做:” 由于“更改处理被明确禁用”,我认为对willChangeValueForKey和didChangeValueForKey的调用会将“TirePressure”标记为脏

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

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

当从存储中提取“旧”车辆(迁移之前创建的车辆)时,其“tirePressure”属性的值为零。(这是预期的行为吗?)

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

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

但他们没有


每次从商店取回这些车辆时,尽管已保存了上下文,“轮胎压力”仍然为零。

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


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

六个月后我终于明白了

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

您确定吗?awakeFromFetch的文档说“您可以使用公共setter来建立临时值。”这让我相信动态访问器已经就位。使用
setPrimitiveValueForKey
包装在
willChangeValueForKey
didChangeValueForKey
中的
setPrimitiveValueForKey
没有“弄脏”对象,因此我可以保存更改。文档说“围绕此方法显式禁用托管对象上下文的更改处理,以便您可以使用公共setter来建立临时值和其他缓存,而不会弄脏对象或其上下文。“问题是对象尚未被观察到,因此没有对象被通知任何更改。这里真正的问题是您不应该在代码中创建默认值。正确移植的模型应该可以帮你。啊,谢谢你澄清这一点。我愿意接受默认值不存在,作为不必手动进行迁移的交换。ATM我愿意在每次获取对象时设置默认值,这会给我在运行时带来性能损失。6个月!非常感谢你回来回答。太好了!!6个月。。。英雄联盟
- (void)awakeFromFetch {
    [super awakeFromFetch];
    if (nil == self.tirePressure) {
        [self willChangeValueForKey:@"tirePressure"];
        self.tirePressure = [NSNumber numberWithDouble:0.0];
        [self didChangeValueForKey:@"tirePressure"];
    }
  }