Core Data (The Migration Process)

迁移过程

在迁移期间,Core Data创建两个堆栈,一个用于源储存,一个用于目标储存。Core Data然后从源栈中获取对象,并将合适的对应对象插入到目标堆栈中。请注意,Core Data必须在新堆栈中重新创建对象。

概述

回想一下,储存是绑定他们的模型。当模型与储存不符合是,需要迁移。有两个曲艺可以获得默认功能并且勾住(hooks for)自定义默认行为:

  • 检查版本偏差并初始化迁移过程。
  • 执行迁移过程时。

要执行迁移过程需要两个Core Data的堆栈,这些堆栈自动为你创建 - 一个用于源储存,一个用与目标储存。迁移过程分为三个阶段执行,将对象从一个堆栈复制到另一个堆栈。

迁移流程的需求

持久储存的迁移有NSMigrationManager的实例执行。要迁移储存,迁移管理器需要几件事:

  • 目标储存的托管对象模型。
    这是持续储存协调员的模型。
  • 可用于打开现有储存的托管对象模型。
  • 通常,定义从源模型到目标模型转换的映射模型。
    如果能有使用轻量级迁移,则不需要映射模型。

你可以指定自定义实体迁移策略类来自定义各个实体的迁移。可以在映射模型中指定自定义迁移的策略类。

自定义实体迁移策略

如果你的新模型只是向现有模型添加了属性或实体,则可能不需要编写任何自定义代码。但是,如果转换复杂,则可能需要创建NSEntityMigrationPolicy的子类来执行转换,如:

  • 如果您有一个Person实体,其中还包含要分割为单独的Address实体的地址信息,但希望确保每个Address的唯一性。
  • 如果您有一个属性来编码要更改为二进制表示形式的字符串格式的数据

你在自定义迁移策略中覆盖的方法对应与迁移过程的不同阶段 - 这些阶段在三阶段迁移中给出的过程的描述被引用。

三阶段迁移

迁移过程本身分为三个阶段。它使用禁用验证规则的源和目标模型的副本,并将所有实体的类更改为NSmanagedObject。

要执行迁移,Core Data设置两个堆栈,一个用于源储存,一个用于目标储存。然后,Core Data一次处理映射模型中的每个实体映射。它将当前实体的对象提取到源堆栈中,在目标对堆栈中创建相应的对象,然后在最终阶段应用验证约束之前,在第二阶段重建目标对象之间的关系。

在一个周期开始之前,负责当前实体的实体迁移策略被发送一个beginEntityMapping:manager:error:的信息。您可以覆盖此方法来执行策略要求的任何初始化。过程如下:

  1. 基于源实例创建目标实例
    这个阶段的开始,实体迁移策略被发送一个 createDestinationInstancesForSourceInstance:entityMapping:manager:error:的信息,结束的时候发送一个 endInstanceCreationForEntityMapping:manager:error的信息。
    在这个阶段中,只有属性(而不是关系)在目标对象中被设置
    获取源实体的实例。对于每个实例,创建目标实体的适当实例(通常只有一个)和其属性填充(对于简单情况,name = &source.name)。每个实体映射的实例保留一个记录,因为在第二阶段可能有用。
  2. 重建关系
    这个阶段的开始,实体迁移策略被擦送一个creatRelationshipsForDestinationInstance:entityMapping:manager:error的信息。结束的时候发送一个endRelationshipCreationForEntityMapping:manager:error:的信息。
    对于每个实体映射(按顺序),对于在第一步中创建的每个实例目标,将重新创建所有关系。
  3. 验证并保存
    在这个阶段,实体迁移策略将发送一个performCustomValidationForEntityMapping:manager:error的信息。
    应用目标模型中的验证规则来确保数据的完整性和一致性,然后保存存储。

在循环结束时,实体迁移策略将发送一个enEntityMapping:manager:error:的信息。可以覆盖此方法以执行策略所需的任何清理。

请注意:Core Data不能简单地将对象提取到源堆栈并将其插入到目标堆栈中,因此必须在新堆栈中重新创建对象。Core Data维护“关系表”,它支出目标储存中的哪个对象是源储存中,哪个对象是迁移版本。反之亦然。而且它由于没有办法刷新正在使用的上下文,所以随着迁移的进行,可能会在迁移管理器中积累许多的对象。如果呈现了重大的内存开销,从而引起性能问题,可以按照“Mtltiple Passes - Dealing With Large Datasets”中的描述来定制过程。

最后编辑于
©著作权归作者所有,转载或内容合作请联系作者
  • 序言:七十年代末,一起剥皮案震惊了整个滨河市,随后出现的几起案子,更是在滨河造成了极大的恐慌,老刑警刘岩,带你破解...
    沈念sama阅读 216,163评论 6 498
  • 序言:滨河连续发生了三起死亡事件,死亡现场离奇诡异,居然都是意外死亡,警方通过查阅死者的电脑和手机,发现死者居然都...
    沈念sama阅读 92,301评论 3 392
  • 文/潘晓璐 我一进店门,熙熙楼的掌柜王于贵愁眉苦脸地迎上来,“玉大人,你说我怎么就摊上这事。” “怎么了?”我有些...
    开封第一讲书人阅读 162,089评论 0 352
  • 文/不坏的土叔 我叫张陵,是天一观的道长。 经常有香客问我,道长,这世上最难降的妖魔是什么? 我笑而不...
    开封第一讲书人阅读 58,093评论 1 292
  • 正文 为了忘掉前任,我火速办了婚礼,结果婚礼上,老公的妹妹穿的比我还像新娘。我一直安慰自己,他们只是感情好,可当我...
    茶点故事阅读 67,110评论 6 388
  • 文/花漫 我一把揭开白布。 她就那样静静地躺着,像睡着了一般。 火红的嫁衣衬着肌肤如雪。 梳的纹丝不乱的头发上,一...
    开封第一讲书人阅读 51,079评论 1 295
  • 那天,我揣着相机与录音,去河边找鬼。 笑死,一个胖子当着我的面吹牛,可吹牛的内容都是我干的。 我是一名探鬼主播,决...
    沈念sama阅读 40,005评论 3 417
  • 文/苍兰香墨 我猛地睁开眼,长吁一口气:“原来是场噩梦啊……” “哼!你这毒妇竟也来了?” 一声冷哼从身侧响起,我...
    开封第一讲书人阅读 38,840评论 0 273
  • 序言:老挝万荣一对情侣失踪,失踪者是张志新(化名)和其女友刘颖,没想到半个月后,有当地人在树林里发现了一具尸体,经...
    沈念sama阅读 45,278评论 1 310
  • 正文 独居荒郊野岭守林人离奇死亡,尸身上长有42处带血的脓包…… 初始之章·张勋 以下内容为张勋视角 年9月15日...
    茶点故事阅读 37,497评论 2 332
  • 正文 我和宋清朗相恋三年,在试婚纱的时候发现自己被绿了。 大学时的朋友给我发了我未婚夫和他白月光在一起吃饭的照片。...
    茶点故事阅读 39,667评论 1 348
  • 序言:一个原本活蹦乱跳的男人离奇死亡,死状恐怖,灵堂内的尸体忽然破棺而出,到底是诈尸还是另有隐情,我是刑警宁泽,带...
    沈念sama阅读 35,394评论 5 343
  • 正文 年R本政府宣布,位于F岛的核电站,受9级特大地震影响,放射性物质发生泄漏。R本人自食恶果不足惜,却给世界环境...
    茶点故事阅读 40,980评论 3 325
  • 文/蒙蒙 一、第九天 我趴在偏房一处隐蔽的房顶上张望。 院中可真热闹,春花似锦、人声如沸。这庄子的主人今日做“春日...
    开封第一讲书人阅读 31,628评论 0 21
  • 文/苍兰香墨 我抬头看了看天上的太阳。三九已至,却和暖如春,着一层夹袄步出监牢的瞬间,已是汗流浃背。 一阵脚步声响...
    开封第一讲书人阅读 32,796评论 1 268
  • 我被黑心中介骗来泰国打工, 没想到刚下飞机就差点儿被人妖公主榨干…… 1. 我叫王不留,地道东北人。 一个月前我还...
    沈念sama阅读 47,649评论 2 368
  • 正文 我出身青楼,却偏偏与公主长得像,于是被迫代替她去往敌国和亲。 传闻我的和亲对象是个残疾皇子,可洞房花烛夜当晚...
    茶点故事阅读 44,548评论 2 352

推荐阅读更多精彩内容