目前,我有两个自定义模型类。之前我在他们之间建立了一对一的关系。但现在由于新的需求变化,我需要将关系转换为一对多。
例如,这就是我之前构建模型类的方式
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)
}
简而言之,您有一个一对一的关系,并且您现在希望将其转换为一对多关系(通过列表),使用现有位置作为列表中的第一个对象。
一个问题是你不能有两个具有相同主键的对象,因此在迁移过程中,必须删除旧位置并将其替换为具有相同属性(和主键)的新位置,然后添加它到作业的
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)
}
}
})
我不确定您是否仍然需要答案,或者也许其他人可能需要解决方案。
主要思想是从领域检索最后创建的位置对象并将其附加到列表中,而不是使用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)
}
请注意:这是我的解决方案,我还没有找到任何关于它的官方文档。