领域迁移中的主键更新
Primary key update in Realm migration
在某些情况下,我必须更新某些对象模型,包括用作主键的 属性。
例如:
- 合并主键
name
(例如 Georges、Anna...) 和 familyName
(例如 Johnson、 Smith...) 属性,并使用新合并的 name
(例如 Georges Johnson...) 作为主键。
- 将
identifier
主键从类型 Int
变为类型 String
但是文档当然明确指出:
Once an object with a primary key is added to a Realm, the primary key cannot be changed
您始终可以删除旧对象并创建新对象,但这会增加重新创建关系的复杂性。
而且我很确定 realm 可能不满意 identifier
类型的任何一种改变(根据我遇到的抛出的异常判断)。
所以我想知道是否有更简单的方法,或者我是否必须做大量的手动繁重工作才能实现我非常简单的目标。
这里是 Realm 的 Katsumi。 Realm 支持主键迁移。
主键只能在迁移期间更改。所以你想改变现有的主键值,你可以编写迁移块,然后你可以为每个新对象分配新值。这些值当然必须是唯一的。
let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { (migration, schemaVersion) in
migration.enumerateObjects(ofType: "Person", { (oldObject, newObject) in
newObject!["key"] = ...
})
})
您也可以更改主键类型。
在那种情况下,您还需要编写一个迁移块并分配新值。因为主键属性在改变类型的时候被清空了。此外,您可以合并或拆分现有的主键 属性。您可以添加一个新的属性,然后将其指定为主键,然后您还应该编写迁移块并分配新的唯一值。
但是,最新版本的 Realm(2.8.0 和 2.8.1)出现了意外错误,即使在迁移期间也不允许修改主键。所以如果你很急,你应该使用以前的版本(2.7.x),如果你不急,请等待下一个版本修复这个错误。
在某些情况下,我必须更新某些对象模型,包括用作主键的 属性。
例如:
- 合并主键
name
(例如 Georges、Anna...) 和familyName
(例如 Johnson、 Smith...) 属性,并使用新合并的name
(例如 Georges Johnson...) 作为主键。 - 将
identifier
主键从类型Int
变为类型String
但是文档当然明确指出:
Once an object with a primary key is added to a Realm, the primary key cannot be changed
您始终可以删除旧对象并创建新对象,但这会增加重新创建关系的复杂性。
而且我很确定 realm 可能不满意 identifier
类型的任何一种改变(根据我遇到的抛出的异常判断)。
所以我想知道是否有更简单的方法,或者我是否必须做大量的手动繁重工作才能实现我非常简单的目标。
这里是 Realm 的 Katsumi。 Realm 支持主键迁移。 主键只能在迁移期间更改。所以你想改变现有的主键值,你可以编写迁移块,然后你可以为每个新对象分配新值。这些值当然必须是唯一的。
let config = Realm.Configuration(schemaVersion: 1, migrationBlock: { (migration, schemaVersion) in
migration.enumerateObjects(ofType: "Person", { (oldObject, newObject) in
newObject!["key"] = ...
})
})
您也可以更改主键类型。 在那种情况下,您还需要编写一个迁移块并分配新值。因为主键属性在改变类型的时候被清空了。此外,您可以合并或拆分现有的主键 属性。您可以添加一个新的属性,然后将其指定为主键,然后您还应该编写迁移块并分配新的唯一值。
但是,最新版本的 Realm(2.8.0 和 2.8.1)出现了意外错误,即使在迁移期间也不允许修改主键。所以如果你很急,你应该使用以前的版本(2.7.x),如果你不急,请等待下一个版本修复这个错误。