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”中的描述来定制过程。

你可能感兴趣的:(Core Data (The Migration Process))