领域迁移:将对象迁移到另一个
Realm Migration: Migrating objects to another
我已将一个新的模型对象添加到我的领域对象中,我正在尝试将数据从我的旧领域对象属性移动到这个新对象。
在旧模式中,我有以下内容:
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?
}
我还添加了这个新模型对象:
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
})
}
}
})
您无需使用 LinkingObjects
执行任何操作,当您查询它们时,realm 会自动计算它们。
您在迁移中需要做的就是将 media
设置为具有您已有值的新 Media
对象。
其他说明:
- 不需要第二个
enumerateObjects
。
- 您可以从
Item
中删除 image
、coverImage
和 video
,因为您要将这些值移动到 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
向项目添加对象时,迁移非常简单。在这种情况下,您无需更改现有属性或新属性或向其添加数据,因此操作更加简单。
所有需要做的就是增加 schemaVersion 并实施您的迁移块。假设之前的版本是 1,将其增加到 2。
let config = Realm.Configuration (
schemaVersion: 2,
migrationBlock: { migration, oldSchemaVersion in
//nothing to do here since we not altering any data
})
Realm 已经知道您的对象有数据,并且该数据将持续存在,因为它不会被更改。所有 Item 对象都将添加新媒体 属性 并链接到新媒体对象。
有关更多示例,请参阅 Local Migrations。更新值部分是您想要实际操作现有数据的时候
编辑:
我们现在有了更多信息,OP 试图做的是将数据从现有对象复制到新对象,然后在对象之间创建关系。这是执行此操作的代码。
初始对象为Item,新对象为Media。对于此示例,我将项目 属性 image
中的数据复制到媒体 属性 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
}
})
我已将一个新的模型对象添加到我的领域对象中,我正在尝试将数据从我的旧领域对象属性移动到这个新对象。
在旧模式中,我有以下内容:
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?
}
我还添加了这个新模型对象:
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
})
}
}
})
您无需使用 LinkingObjects
执行任何操作,当您查询它们时,realm 会自动计算它们。
您在迁移中需要做的就是将 media
设置为具有您已有值的新 Media
对象。
其他说明:
- 不需要第二个
enumerateObjects
。 - 您可以从
Item
中删除image
、coverImage
和video
,因为您要将这些值移动到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
向项目添加对象时,迁移非常简单。在这种情况下,您无需更改现有属性或新属性或向其添加数据,因此操作更加简单。
所有需要做的就是增加 schemaVersion 并实施您的迁移块。假设之前的版本是 1,将其增加到 2。
let config = Realm.Configuration (
schemaVersion: 2,
migrationBlock: { migration, oldSchemaVersion in
//nothing to do here since we not altering any data
})
Realm 已经知道您的对象有数据,并且该数据将持续存在,因为它不会被更改。所有 Item 对象都将添加新媒体 属性 并链接到新媒体对象。
有关更多示例,请参阅 Local Migrations。更新值部分是您想要实际操作现有数据的时候
编辑:
我们现在有了更多信息,OP 试图做的是将数据从现有对象复制到新对象,然后在对象之间创建关系。这是执行此操作的代码。
初始对象为Item,新对象为Media。对于此示例,我将项目 属性 image
中的数据复制到媒体 属性 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
}
})