核心数据自定义策略迁移 - 创建关系

问题描述 投票:0回答:1

我有一个简单的示例项目,其中“Store”有一些 Int 16 类型的属性“apples”、“oranges”、“pineapples”。我正在尝试进行自定义重量级迁移来创建一个新的“Item”具有名称和计数的实体。我能够使用映射模型和自定义策略成功迁移,将旧值迁移到新项目实体。

class ItemsMapping: NSEntityMigrationPolicy {

override func createDestinationInstances(forSource sInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
    if sInstance.entity.name == "Store" {
        if let apples = sInstance.primitiveValue(forKey: "apples") as? Int16 {
            let item = NSEntityDescription.insertNewObject(forEntityName: "Item", into: manager.destinationContext)
            item.setValue("Apples", forKey: "name")
            item.setValue(apples, forKey: "count")
        }
        
        if let oranges = sInstance.primitiveValue(forKey: "oranges") as? Int16 {
            let item = NSEntityDescription.insertNewObject(forEntityName: "Item", into: manager.destinationContext)
            item.setValue("Oranges", forKey: "name")
            item.setValue(oranges, forKey: "count")
        }
        
        if let pineapples = sInstance.primitiveValue(forKey: "pineapples") as? Int16 {
            let item = NSEntityDescription.insertNewObject(forEntityName: "Item", into: manager.destinationContext)
            item.setValue("Pineapples", forKey: "name")
            item.setValue(pineapples, forKey: "count")
        }
    }
}

override func createRelationships(forDestination dInstance: NSManagedObject, in mapping: NSEntityMapping, manager: NSMigrationManager) throws {
    print("test")
}

唯一的问题是 Store 对象需要与 Item 建立一对多关系,并且我在网上找不到任何关于通过重量级迁移创建关系的好示例。

这是初始数据模型:

以及新的数据模型(v2):

最后,这是我的映射模型:

如果没有关系,我的 createDestinationInstances 覆盖将按预期工作,但我需要创建与 Store 对象的关系,并且我无法在网上找到任何好的资源。

任何帮助将不胜感激!

swift core-data
1个回答
0
投票

NSEntityMigrationPolicy
中的函数名称可能有点令人困惑。

createDestinationInstances(...)
中,您采用现有的托管对象并创建新的托管对象以在迁移后替换它。您正在处理
Store
实体,因此您创建了一个新的
Store
来替换旧的。不要在此处创建任何其他托管对象。创建新的
Store
后,

  • 设置其
    name
    以匹配
    sInstance
    参数中的
  • 致电
    manager.associate(...)
    告诉经理新的
    Store
    将取代旧的。 (对于以下步骤的工作非常非常重要)。

items
关系目前为零。这是下一步。

createRelationships(...)
中,
dInstance
参数是您在上面创建的新的迁移后
Store
。您可以在此处为其创建新的
Item
实例。你这样做:

  1. 通过调用
    Store
    查找原始预迁移
    manager.sourceInstnaces(...)
    。这会为您提供一个数组,但其中应该只有一个对象。
  2. 创建新的
    Item
    对象。这与您在问题中执行的操作几乎相同,只是您将查看在步骤 1 中查找的预迁移
    Store
    来决定要创建什么
    Item
  3. 创建新商店(此处为
    dInstance
    )与您在步骤 2 中创建的新商品之间的关系。

有点复杂,但应该是这样的。

© www.soinside.com 2019 - 2024. All rights reserved.