如何在 Realm Swift 中将一对一关系迁移为一对多关系

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

目前,我有两个自定义模型类。之前我在他们之间建立了一对一的关系。但现在由于新的需求变化,我需要将关系转换为一对多。

例如,这就是我之前构建模型类的方式

class Location: Object {
  @objc dynamic private var id: String = NSUUID().uuidString
  @objc dynamic var typeString: String = 

}

class Job :Object {
@objc dynamic var id: String = NSUUID().uuidString
let location: Location?
}

新结构

class Job :Object {
@objc dynamic var id: String = NSUUID().uuidString
let locations = RealmSwift.List<Location>()
}

所以基本上我想在 Job 类中保存多个位置对象。这个新结构对我来说工作得很好。但现在我想将旧数据迁移到这个新设置中。我尝试使用以下代码来实现此目的,但没有成功。

migration.deleteData(forType: Location.className)
migration.enumerate(ofType:Job.className) { oldObject, newObject in
    let location = migration.create(Location, value: oldObject!["location"]!)
    (newObject!["locations"] as! List<MigrationObject>).append(location)
}
ios realm swift5
2个回答
0
投票

简而言之,您有一个一对一的关系,并且您现在希望将其转换为一对多关系(通过列表),使用现有位置作为列表中的第一个对象。

一个问题是你不能有两个具有相同主键的对象,因此在迁移过程中,必须删除旧位置并将其替换为具有相同属性(和主键)的新位置,然后添加它到作业的

locations
列表属性。

这是代码:

let config = Realm.Configuration( schemaVersion: vers, migrationBlock: { migration, oldSchemaVersion in
     if (oldSchemaVersion < vers) {
        migration.deleteData(forType: Location.className()) //delete all locations
        migration.enumerateObjects(ofType: Job.className()) { oldItem, newItem in
           let existingLoc = oldItem!["location"]
           let updatedLoc = migration.create(Location.className(), value: existingLoc)
           let locList = newItem!["locations"] as! List<MigrationObject>
           locList.append(updatedLoc)
        }
     }
 })

0
投票

我不确定您是否仍然需要答案,或者也许其他人可能需要解决方案。

主要思想是从领域检索最后创建的位置对象并将其附加到列表中,而不是使用MigrationObject

migration.enumerateObjects(ofType: Job.className()) { oldItem, newItem in
       let existingLoc = oldItem!["location"]
       let updatedLoc = migration.create(Location.className(), value: existingLoc)
       let savedLoc = updatedLoc.realm?.object(ofType: Location.self, forPrimaryKey: existingLoc.id)
       locList.append(savedLoc)
    }

请注意:这是我的解决方案,我还没有找到任何关于它的官方文档。

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