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

时间:2019-08-28 13:15:56

标签: swift database migration realm realm-mobile-platform

我已将新的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

                    })
                }
            }
    })

2 个答案:

答案 0 :(得分:2)

您无需对LinkingObjects进行任何操作,领域会在您查询它们时自动计算它们。

在迁移过程中,您需要做的全部工作就是将media设置为具有您已有值的新Media对象。

其他说明:

  • 不需要第二个enumerateObjects
  • 您可以从image中删除coverImagevideoItem,因为您正在将这些值移至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
        }
})