领域版本迁移重命名 属性 不存在
Realm version Migration renaming property not existed
您好,我进行了 Realm 迁移,但遇到了错误
下面是我的情况错误场景
第一
我有一个简单的 User
模型版本 0(默认)
class User: Object {
dynamic var username = ""
dynamic var date = NSDate()
}
在版本 1 中添加日期 2
class User: Object {
dynamic var username = ""
dynamic var date = NSDate()
dynamic var date2 = NSDate()
}
并迁移
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
if oldSchemaVersion < 1 {
migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
newObject!["date2"] = oldObject!["date"] as! NSDate
})
}
}
并在版本 3 中添加日期 3,并在版本 4 中将日期 3 重命名为日期 4
class User: Object {
dynamic var username = ""
dynamic var date = NSDate()
dynamic var date2 = NSDate()
dynamic var date4 = NSDate()
}
并迁移
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 4,
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
if oldSchemaVersion < 1 {
migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
newObject!["date2"] = oldObject!["date"] as! NSDate
})
}
if oldSchemaVersion < 2 {
migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
newObject!["date3"] = oldObject!["date2"] as! NSDate
})
}
if oldSchemaVersion < 3 {
migration.renameProperty(onType: User.className(), from: "date3", to: "date4")
}
}
当我按顺序迁移 0 -> 1 -> 2 -> 3 -> 4 时工作正常
但是当从 0 版本迁移到 4 版本时导致 fatal error: 'try!' expression unexpectedly raised an error
"Cannot rename property 'User.date3' because it does not exist."
在这种情况下,我如何将 0 ~ 3 版本迁移到 4 而没有以上不存在的例外情况?
您需要为每个 属性 进行迁移,这些 属性 将存在于您的架构的最终版本中但不在原始版本中,因为 Realm 需要将此 属性 添加到您已经拥有的所有内容中数据库(这就是迁移所做的 - 它填补了漏洞)。为什么要删除有效的代码?你得到 date3 的异常,因为它不存在于模式 0 中,你说你想直接从 0 到 4 ......你可以重新开始所有属性的完整定义并从头开始重新加载所有数据而不迁移,或者保持你的工作代码不变。这没什么问题。问我任何我没有充分解释的问题。
如果 schemaVersion 3 只是一个具有 "date3" 的版本,则必须单独处理版本 3(我不知道 schemaVersion 2 中发生了什么)。而且您不能将 oldObject["date2"] 插入到 newObject["date3"],因为 newObject 没有 date3 作为错误。迁移的目的是将旧方案与当前方案进行匹配。在你的项目中尝试一下,它对我有用!
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 4,
migrationBlock: { migration, oldSchemaVersion in
migration.enumerateObjects(ofType: User.className(), { (oldObject, newObject) in
if oldSchemaVersion < 1 {
newObject?["date2"] = oldObject!["date"] as! NSDate
}
// use newObject["date2"] instead of oldObject["date2"] for schemaVerion 0
if oldSchemaVersion < 2 {
newObject?["date4"] = newObject?["date2"] as! NSDate
}
})
// separate version 3 for "date3"
if oldSchemaVersion == 3 {
migration.renameProperty(onType: User.className(), from: "date3", to: "date4")
}
})
并且我建议您使用一次 func enumerateObjects。您不需要每次都获取所有对象。希望有用!
您好,我进行了 Realm 迁移,但遇到了错误
下面是我的情况错误场景
第一
我有一个简单的 User
模型版本 0(默认)
class User: Object {
dynamic var username = ""
dynamic var date = NSDate()
}
在版本 1 中添加日期 2
class User: Object {
dynamic var username = ""
dynamic var date = NSDate()
dynamic var date2 = NSDate()
}
并迁移
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
if oldSchemaVersion < 1 {
migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
newObject!["date2"] = oldObject!["date"] as! NSDate
})
}
}
并在版本 3 中添加日期 3,并在版本 4 中将日期 3 重命名为日期 4
class User: Object {
dynamic var username = ""
dynamic var date = NSDate()
dynamic var date2 = NSDate()
dynamic var date4 = NSDate()
}
并迁移
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 4,
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
if oldSchemaVersion < 1 {
migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
newObject!["date2"] = oldObject!["date"] as! NSDate
})
}
if oldSchemaVersion < 2 {
migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in
newObject!["date3"] = oldObject!["date2"] as! NSDate
})
}
if oldSchemaVersion < 3 {
migration.renameProperty(onType: User.className(), from: "date3", to: "date4")
}
}
当我按顺序迁移 0 -> 1 -> 2 -> 3 -> 4 时工作正常
但是当从 0 版本迁移到 4 版本时导致 fatal error: 'try!' expression unexpectedly raised an error
"Cannot rename property 'User.date3' because it does not exist."
在这种情况下,我如何将 0 ~ 3 版本迁移到 4 而没有以上不存在的例外情况?
您需要为每个 属性 进行迁移,这些 属性 将存在于您的架构的最终版本中但不在原始版本中,因为 Realm 需要将此 属性 添加到您已经拥有的所有内容中数据库(这就是迁移所做的 - 它填补了漏洞)。为什么要删除有效的代码?你得到 date3 的异常,因为它不存在于模式 0 中,你说你想直接从 0 到 4 ......你可以重新开始所有属性的完整定义并从头开始重新加载所有数据而不迁移,或者保持你的工作代码不变。这没什么问题。问我任何我没有充分解释的问题。
如果 schemaVersion 3 只是一个具有 "date3" 的版本,则必须单独处理版本 3(我不知道 schemaVersion 2 中发生了什么)。而且您不能将 oldObject["date2"] 插入到 newObject["date3"],因为 newObject 没有 date3 作为错误。迁移的目的是将旧方案与当前方案进行匹配。在你的项目中尝试一下,它对我有用!
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 4,
migrationBlock: { migration, oldSchemaVersion in
migration.enumerateObjects(ofType: User.className(), { (oldObject, newObject) in
if oldSchemaVersion < 1 {
newObject?["date2"] = oldObject!["date"] as! NSDate
}
// use newObject["date2"] instead of oldObject["date2"] for schemaVerion 0
if oldSchemaVersion < 2 {
newObject?["date4"] = newObject?["date2"] as! NSDate
}
})
// separate version 3 for "date3"
if oldSchemaVersion == 3 {
migration.renameProperty(onType: User.className(), from: "date3", to: "date4")
}
})
并且我建议您使用一次 func enumerateObjects。您不需要每次都获取所有对象。希望有用!