更新@PersistableEnum时是否需要执行迁移块?

问题描述 投票:0回答:1

我有一个像这样的领域模型设置:

enum RealmEnumExample: String, Codable, PersistableEnum {
    case hot, cold, cloudy, rainy
}

final class RealmExample: Object, ObjectKeyIdentifiable {
    @Persisted(primaryKey: true) var id: Int
    @Persisted var weather: RealmEnumExample
    
    init(id: Int, weather: RealmEnumExample) {
        
        super.init()
        self.id = id
        self.weather = weather
    }
    
    override init() {
        super.init()
    }
}

如果我从 RealmNumExample 中删除冷和多云并添加暖,除了更新架构版本之外,是否还需要执行领域迁移块? Realm 文档表示,当添加和删除属性时,realm 会自动为您进行迁移,但在此类情况下,PersistableEnums 尚不清楚。在此示例中,何时需要重命名属性?假设我将“cloudy”“重命名”为“warm”,这不是与删除“cloudy”并添加“warm”相同吗?因此,在这种情况下也不需要迁移块,只需要更新架构版本?

我很困惑在这种情况下何时适合诉诸“重命名”属性并执行迁移块或允许领域进行迁移(如果将其处理为添加和删除属性)。

ios swift realm
1个回答
0
投票

答案是肯定的,如果 Realm PersistableEnum 以破坏性方式更改,则需要执行迁移以使现有对象属性与删除的 Enum 案例保持一致。

  • 仅添加
    .warm
    案例只是一种非破坏性更改,并且由于还没有对象具有
    .warm
    ,因此无需迁移任何内容。

原因是具有冷和多云枚举值的 RealmExample 对象具有存储在

cold
属性(字符串)中的实际字符串值
cloudy
weather

如果从枚举中删除这些属性,则属性值将无法再映射回要解析的枚举。例如冷已经没有意义了

更新版本号并进行迁移将是解决方案。此代码会将具有

.cold
案例的对象映射到新添加的
.warm
案例。

您可以在该语句中插入任何附加逻辑,以确定哪些属性映射到新添加的

warm
案例。

let vers = UInt64(4)
let config = Realm.Configuration( fileURL: pathToThisRealmFile, schemaVersion: vers, migrationBlock: { migration, oldSchemaVersion in
     print("oldSchemaVersion: \(oldSchemaVersion)")
     if (oldSchemaVersion < vers) {
        print("  performing migration")
         migration.enumerateObjects(ofType: RealmExample.className(), { oldObject, newObject in
             if oldObject!["weather"] as? String == "cold" {
                 newObject!["weather"] = RealmEnumExample.warm
             }
         })
     }
 })
© www.soinside.com 2019 - 2024. All rights reserved.