Core Data 版本迁移攻略(下)

4. 自定义手动迁移

手动迁移的重点就是 「你可以自定义一个 MigrationPolicy」,迁移策略是自定义迁移的最核心的一个类,实现一个 NSEntityMigrationPolicy 的子类来允许你自定义实现一些 Swift 代码来控制 Entity 实体迁移的时候的逻辑。

官方文档中,这么描述:

NSEntityMigrationPolicy 的实例为一个实体映射自定义的迁移策略。

New file 创建你自己的一个 .swift 类,命名:OldEntityNameToNewEntityNameMigrationPolicyV2toV3

import CoreData
import UIKit

let errorDomain = "Migration"

class OldEntityNameToNewEntityNameMigrationPolicyV2toV3: NSEntityMigrationPolicy {
 
}

Mapping Model 中选择对应的 Entity Mapping,然后在 Xcode 右侧找到 Custom Policy,设置成你刚自己创建的这个 Policy 的子类。

当你设置了这个自定义迁移策略的时候,Core Data 再去做迁移的时候,当迁移到跟你设置的这个相关的数据的时候,就会使用你的这个迁移策略,然后你怎么去干预呢,通过下面的这些方法来做:

NSEntityMigrationPolicy 中目前是空的,目前有几个方法可以进行重写

  1. 迁移即将开始的时候:

     func beginEntityMapping(mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool
    
  2. 在旧数据基础上创建新的实例的时候调用:

     func createDestinationInstancesForSourceInstance(sInstance: NSManagedObject, entityMapping mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool
    
  3. 2结束的时候:

     func endInstanceCreationForEntityMapping(mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool
    
  4. 创建新的relationship实体之间关系的时候调用:

     func createRelationshipsForDestinationInstance(dInstance: NSManagedObject, entityMapping mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool`
    
  5. 4结束的时候:

     func endRelationshipCreationForEntityMapping(mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool
    
  6. 验证 保存数据的时候:

     func performCustomValidationForEntityMapping(mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool
    
  7. 迁移结束的时候调用:

     func endEntityMapping(mapping: NSEntityMapping, manager: NSMigrationManager, error: NSErrorPointer) -> Bool

你可能感兴趣的:(Core Data 版本迁移攻略(下))