领域迁移:将对象迁移到另一个

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 中删除 imagecoverImagevideo,因为您要将这些值移动到 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
        }
})