【问题标题】:Realm Migration: Migrating objects to another领域迁移:将对象迁移到另一个对象
【发布时间】:2019-08-28 13:15:56
【问题描述】:

我已将一个新模型对象添加到我的领域对象中,并且我正在尝试将数据从我的旧领域对象属性移动到这个新对象。

在旧架构中,我有以下内容:

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

                    })
                }
            }
    })

【问题讨论】:

  • 您的意思是用 Media 对象替换 Item 对象?如果是这样,则字段名称不同,并且您的 Media 对象链接回 Item 对象,因此如果删除 Item 对象,那将是一个问题。此外,您的 Media 对象没有 coverImage 属性等。您能澄清一下吗?
  • @Jay 不,我没有用 Media 对象替换 Item 对象,我在 Item 对象中添加了一个新属性“media”,它是对 Media 对象的引用。我想使用 Media 对象来存储“图像”“视频”等并将它们与 Item 对象分开。当用户更新应用程序时,我想将值从 Item 对象传输到新的 Media 对象。

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


【解决方案1】:

您无需对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

【讨论】:

  • 感谢您的回复,我对此很陌生,出于某种原因,我无法完全理解您的建议。你介意用代码给我看吗?谢谢。
  • 你不清楚哪一部分?我添加了一个示例,说明如何在迁移中执行此操作。
  • 我已将此代码添加到迁移中,它从数据库中删除了我的所有数据。
  • 嘿克雷格,谢谢你的帮助。你帮我解决了我的问题,但是下面有 2 个正确答案,你和 Jay。我不知道该接受哪一个。
  • @IamWayne 很高兴您的问题已解决。如果两个答案都有帮助,请对它们都投赞成票,然后接受这个答案 - 编辑后这是一个很好的解决方案。
【解决方案2】:

将对象添加到项目时,迁移非常简单。在这种情况下,您无需更改或向现有或新属性添加数据,因此更容易。

所有需要做的就是增加 schemaVersion 并实现您的迁移块。假设之前的版本是 1,将其增加到 2。

let config = Realm.Configuration (
    schemaVersion: 2,
    migrationBlock: { migration, oldSchemaVersion in
        //nothing to do here since we not altering any data
})

Realm 已经知道您的 Object 具有数据,并且该数据将持续存在,因为它没有被更改。所有 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
        }
})

【讨论】:

  • 感谢您的回复,但我在 Item 对象中添加了一个名为“media”的新属性。应用程序崩溃,因为新的 Item.media 属性需要迁移。我想将我的数据从 Item 对象传输到新的 Media 对象。
  • @IamWayne 我复制了您的对象和代码并运行了项目,它工作正常。添加属性不需要您“传输您的数据”。但是您的评论与问题中的代码不匹配;在代码中,您只是添加一个属性,而不是用任何数据填充它。您在此处的评论说您想传输我的数据。您能否澄清一下这意味着什么,因为您的代码中没有任何内容使用任何数据填充 Media 对象。
  • 对不起,我是一个新的尝试学习领域。每当用户更新应用程序时,我希望已经使用项目属性“image”、“coverImage”等存储的数据与新的媒体属性“fullImage”、“thumbnailImage”等一起存储。感谢您的帮助。跨度>
  • @IamWayne 仍然有点困惑,所以让我重复一遍。您的数据库中当前有 Item 对象。您正在向数据库中添加一个新的媒体对象,并在项目对象和媒体对象之间创建关系。在迁移期间,您希望复制存在于项目对象中的数据并填充媒体对象中的属性,因此创建重复数据,因为它随后将存在于项目和媒体中。对吗?
  • 是的,这是正确的。我会从 Item 对象中删除这些属性,因此迁移后数据将在 Media 对象上可用。很抱歉造成混乱,感谢您的帮助。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2011-08-07
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多