Core Data 模型版本升级和数据迁移(三)映射概述

虽然 Core Data 可以利用“轻量级迁移”(“Lightweight Migration.”),但如果 Core Data 推测不出来时,我们需要告诉 Core Data 如何转换,这就是映射模型(mapping model)了。

映射模型(mapping model)是一个集合,集合包含了所有必须的转换,比如重命名实体/表、添加新属性/字段等。创建映射模型貌似不难,因为Xcode提供了映射模型编辑器(mapping model editor ),直接使用编辑器搞定 一切。?

映射模型对象(Mapping Model Objects)


像管理对象模型(managed object model),映射模型也是一个对象的集合,, 两者并列关系,映射相关的类包括 NSMappingModelNSEntityMappingNSPropertyMapping 。

  • 实体/表映射类(NSEntityMapping)的实例指定了源实体(source entity)、对应的目标实体(destination entity)、映射类型(mapping type),映射类型包括:添加 (add)、删除(remove)、拷贝(copy)、转换(transform)。

  • 属性/字段映射类(NSPropertyMapping)的实例指定了属性/字段名称(既有源实体/中的,也有目标实体/表中的)、值表达式(value expression),该值表达式用于解释如何创建目标实体/表中的属性/字段值。

映射模型不含任何实体/表迁移策略(NSEntityMigrationPolicy)信息,策略信息可能包含在 NSEntityMapping 中。关于实体/表迁移策略参见 “Custom Entity Migration Policies.”

如上,我们可以处理简单的属性/字段迁移,方法是:在Xcode中使用映射模型编辑器配置特定的值表达式,比如:

  • 将数据由一个属性/字段迁移至另一个属性/字段

    例子:源表中有一个字段 amount,现在要重命名为 totalCost,那么就可以给新字段 totalCost  的属性/字段映射输入相应的值表达式  $source.amount。

  • 将一个属性/字段的值进行转换

    例子:将字段中原本存储的华氏温度值都转换为摄氏温度值,那就使用值表达式  ($source.temperature - 32.0) / 1.8。

  • 将对象由一个关系迁移至另一个关系

    To rename trades to transactions, enter the custom value expression for the transactions property mapping as FUNCTION($manager, "destinationInstancesForEntityMappingNamed:sourceInstances:", "TradeToTrade", $source.trades). (这里假设将 Trade 重命名为 TradeToTrade)

映射模型中有6个预定义的Key可以在值表达式中引用,如下。


注意:在OC源代码中使用他们,就使用NSXxxKey,在值表达式中就使用 $xxxx。


Xcode中创建映射模型


Xcode中,文件菜单(File menu),选择新文件(New File),选择设计(Design),选择映射模型(Mapping Model)。.然后,在工作面板上,选择源模型和目标模型,然后点击完成(Finish),Xcode 将创建新的映射模型,该模型包含的默认映射都是 Xcode 根据源模型和目标模型自动推测出来的。例如,Xcode自动根据 Figure 1-1 和 Figure 1-2 创建了映射模型 Figure 4-1,如下:

  Figure 4-1   Mapping model for versions 1-2 of the Core Recipes models


注意:自定义值表达式中的Xcode保留字(Reserved words): 如果你的值表达式中出现了Xcode保留字,如SIZE、FIRST、、LAST,那么你必须转义处理,使用#符号,如:$source.#size。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值