我有一个iOS / Swift应用,需要在其中更改并向Realm
对象添加一些新属性,这意味着我将必须创建一个新架构并更改{{1 }},因此它可以处理新的更改。
应用程序启动后,哪里是放置我的代码以在Realm
内部重组现有数据的最佳位置?
编辑:
我知道如何创建迁移以及在何处进行迁移。
我不确定在迁移代码运行之后Realm
对Realm
中的所有数据进行一些更改之后,哪里是遍历Realm
中所有记录的好地方。
更具体地说,我需要遍历记录的主要原因是因为我当前正在使用String
属性来存储quantities
,如下所示……2 pcs
,不要问我为什么,但是现在我需要从数量值中删除pcs
,只剩下2
才能将属性更改为Int
或{{1} }。我知道我知道,使用字符串存储数量真是愚蠢。
答案 0 :(得分:1)
使用AppDelegate的disFinishLaunchWithOptions
方法编写迁移代码。
请参考以下参考文献:
本地迁移:
本地迁移是通过设置来定义的 Realm.Configuration.schemaVersion和 Realm.Configuration.migrationBlock。您的迁移块提供了所有 将数据模型从以前的模式转换为新模式的逻辑 模式。使用此配置创建领域时,迁移 块将应用于将领域更新为给定的架构版本 如果需要迁移。
假设我们要迁移先前声明的Person模型。的 最小的必要迁移块如下:
// Inside your application(application:didFinishLaunchingWithOptions:)
let config = Realm.Configuration(
// Set the new schema version. This must be greater than the previously used
// version (if you've never set a schema version before, the version is 0).
schemaVersion: 1,
// Set the block which will be called automatically when opening a Realm with
// a schema version lower than the one set above
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
if (oldSchemaVersion < 1) {
// Nothing to do!
// Realm will automatically detect new properties and removed properties
// And will update the schema on disk automatically
}
})
// Tell Realm to use this new configuration object for the default Realm
Realm.Configuration.defaultConfiguration = config
// Now that we've told Realm how to handle the schema change, opening the file
// will automatically perform the migration
let realm = try! Realm()
更新:
realm.io official docs已经提供了迁移所需的所有信息。
本地迁移
如果您只想添加新属性,则以上代码适用于 您。无需迭代所有记录。旧记录保持默认 相应行的值。
更新值
如果要使用现有列值添加新属性。您 需要迭代所有记录。请参考下面的代码。
// Inside your application(application:didFinishLaunchingWithOptions:)
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
if (oldSchemaVersion < 1) {
// The enumerateObjects(ofType:_:) method iterates
// over every Person object stored in the Realm file
migration.enumerateObjects(ofType: Person.className()) { oldObject, newObject in
// combine name fields into a single field
let firstName = oldObject!["firstName"] as! String
let lastName = oldObject!["lastName"] as! String
newObject!["fullName"] = "\(firstName) \(lastName)"
}
}
})
重命名属性
如果您只想重命名属性,请使用以下代码。
// Inside your application(application:didFinishLaunchingWithOptions:)
Realm.Configuration.defaultConfiguration = Realm.Configuration(
schemaVersion: 1,
migrationBlock: { migration, oldSchemaVersion in
// We haven’t migrated anything yet, so oldSchemaVersion == 0
if (oldSchemaVersion < 1) {
// The renaming operation should be done outside of calls to `enumerateObjects(ofType: _:)`.
migration.renameProperty(onType: Person.className(), from: "yearsSinceBirth", to: "age")
}
})