我已将新的Model对象添加到我的领域对象,并且我试图将数据从旧的领域对象属性移到该新对象。
在旧模式中,我有以下内容:
class Item: Object {
@objc dynamic var image = ""
@objc dynamic var coverImage = ""
@objc dynamic var video = ""
}
在新架构中,我添加了一个名为 media 的新属性。 所以现在它是这个
class Item: Object {
@objc dynamic var image = ""
@objc dynamic var coverImage = ""
@objc dynamic var video = ""
@objc dynamic var media: Media?
}
我还添加了这个新的Model对象:
class Media: Object {
@objc dynamic var fullImage = ""
@objc dynamic var thumbnailImage = ""
@objc dynamic var video = ""
var item = LinkingObjects(fromType: Item.self, property: "media")
}
我的目标是将数据从旧的 Item 对象移动到新的 Media 对象。
我试图做这样的事情,但是我不知道如何迁移该链接对象,朝着正确方向的任何帮助将不胜感激。
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
// enumerate first object
migration.enumerateObjects(ofType: Item.className()) { oldItem, newItem in
let image = oldItem?["image"] as! String
let coverImage = oldItem?["coverImage"] as! String
let video = oldItem?["video"] as! String
//migrate second object
migration.enumerateObjects(ofType: Media.className(), { (oldMedia, newMedia) in
})
}
}
})
答案 0 :(得分:2)
您无需对LinkingObjects
进行任何操作,领域会在您查询它们时自动计算它们。
在迁移过程中,您需要做的全部工作就是将media
设置为具有您已有值的新Media
对象。
其他说明:
enumerateObjects
。image
中删除coverImage
,video
和Item
,因为您正在将这些值移至Media
编辑:这是您迁移所需要的。
let media = Media()
media.fullImage = oldItem?["image"] as! String
media.thumbnailImage = oldItem?["coverImage"] as! String
media.video = oldItem?["video"] as! String
newItem?["media"] = media
答案 1 :(得分:1)
将对象添加到项目时,迁移非常简单。在这种情况下,您无需更改数据或将数据添加到现有或新属性,因此更加容易。
所有需要做的就是增加schemaVersion并实现您的迁移块。假设以前的版本是1,则将其增加到2。
let config = Realm.Configuration (
schemaVersion: 2,
migrationBlock: { migration, oldSchemaVersion in
//nothing to do here since we not altering any data
})
领域已经知道您的对象包含数据,并且该数据将保持不变,因为它没有被更改。所有的Item对象都将添加新的media属性,并链接到新的Media对象。
有关更多示例,请参见Local Migrations。当您要实际操作现有数据时,“更新值”部分
编辑:
我们现在有了更多的信息,OP试图做的是将数据从现有对象复制到新对象,然后在对象之间建立关系。这是执行此操作的代码。
初始对象是Item,新对象是Media。对于此示例,我将Item属性image
中的数据复制到Media属性fullImage
let config = Realm.Configuration (
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
migration.enumerateObjects(ofType: Item.className() ) { oldObject, newObject in
let image = oldObject!["image"] as! String
let media = Media()
media.fullImage = image
newObject!["media"] = media
}
})