在迁移过程中删除 属性

Remove property during migration

我查看了 Realm 站点上的文档,但找不到任何描述如何在迁移中删除 属性 的内容。我采用了一组彼此足够相似的属性并将它们移动到一个新对象中。类似于:

class MyObject: Object {
    @objc dynamic var siteName = ""
    @objc dynamic var lat = 0.0
    @objc dynamic var lon = 0.0
    @objc dynamic var roadNames = ""
    @objc dynamic var startTime = ""
    @objc dynamic var endTime = ""
    @objc dynamic var comments: String = ""
    @objc dynamic var complete: Bool = false
}

然后我将其更改为:

class Site: Object {
    @objc dynamic var siteName = ""
    @objc dynamic var lat = 0.0
    @objc dynamic var lon = 0.0
    @objc dynamic var roadNames = ""
} 

class MyObject: Object {
    @objc dynamic var site: Site?
    @objc dynamic var startTime = ""
    @objc dynamic var endTime = ""
    @objc dynamic var comments: String = ""
    @objc dynamic var complete: Bool = false
}

而我的迁移是

let block: MigrationBlock = { (migration: Migration, oldSchemaVersion) in
    if oldSchemaVersion < 1 {
        migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
            newObject!["siteName"] = oldObject!["siteName"]
            newObject!["lat"] = oldObject!["lat"]
            newObject!["lon"] = oldObject!["lon"]
            newObject!["roadNames"] = oldObject!["roadNames"]

            // Delete old properties.
        }
    }
}

我的迁移应该如何删除属性?

如果阅读 Realm guide on migrations,您会在其中一个代码块的注释中看到:

        // Nothing to do!
        // Realm will automatically detect new properties and removed properties
        // And will update the schema on disk automatically

因此您无需担心删除属性,因为它们会自动删除。

不过,您需要担心的是如何迁移其他值。您应该为每个 MyObject 创建一个 Site 并为该 Site 分配属性,我看不到您在这里这样做。有关如何在迁移块中创建新的 Site,请参阅

您的迁移块应该类似于:

migration.enumerateObjects(ofType: MyObject.className()) { oldObject, newObject in
    let site = migration.create(Site.className())
    site["siteName"] = oldObject!["siteName"]
    site["lat"] = oldObject!["lat"]
    site["lon"] = oldObject!["lon"]
    site["roadNames"] = oldObject!["roadNames"]
    newObject!["site"] = site
}