Удалить свойство во время миграции - PullRequest
1 голос
/ 08 мая 2019

Я просмотрел документы на сайте 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.
        }
    }
}

Как моя миграция должна удалить свойства?

1 Ответ

1 голос
/ 08 мая 2019

Если прочитать руководство по миграции Realm , вы увидите, что в комментариях в одном из блоков кода написано:

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

Так что вам не нужно беспокоиться об удалении свойств, поскольку они удаляются автоматически.

Однако вам нужно беспокоиться о том, как переносить другие значения. Вы должны создать Site для каждого MyObject и назначить свойства этому 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
}
...