我有一个像这样的领域模型设置:
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”相同吗?因此,在这种情况下也不需要迁移块,只需要更新架构版本?
我很困惑在这种情况下何时适合诉诸“重命名”属性并执行迁移块或允许领域进行迁移(如果将其处理为添加和删除属性)。
答案是肯定的,如果 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
}
})
}
})