我有一个简单的示例项目,其中“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 对象的关系,并且我无法在网上找到任何好的资源。
任何帮助将不胜感激!
NSEntityMigrationPolicy
中的函数名称可能有点令人困惑。
在
createDestinationInstances(...)
中,您采用现有的托管对象并创建新的托管对象以在迁移后替换它。您正在处理 Store
实体,因此您创建了一个新的 Store
来替换旧的。不要在此处创建任何其他托管对象。创建新的 Store
后,
name
以匹配 sInstance
参数中的manager.associate(...)
告诉经理新的Store
将取代旧的。 (对于以下步骤的工作非常非常重要)。items
关系目前为零。这是下一步。
在
createRelationships(...)
中,dInstance
参数是您在上面创建的新的迁移后 Store
。您可以在此处为其创建新的 Item
实例。你这样做:
Store
查找原始预迁移 manager.sourceInstnaces(...)
。这会为您提供一个数组,但其中应该只有一个对象。Item
对象。这与您在问题中执行的操作几乎相同,只是您将查看在步骤 1 中查找的预迁移 Store
来决定要创建什么 Item
。dInstance
)与您在步骤 2 中创建的新商品之间的关系。有点复杂,但应该是这样的。