迁移运行后立即遍历Realm中的所有记录-Swift / iOS

时间:2019-04-17 11:41:04

标签: ios swift realm

我有一个iOS / Swift应用,需要在其中更改并向Realm对象添加一些新属性,这意味着我将必须创建一个新架构并更改{{1 }},因此它可以处理新的更改。

应用程序启动后,哪里是放置我的代码以在Realm内部重组现有数据的最佳位置?

编辑:
我知道如何创建迁移以及在何处进行迁移。

我不确定在迁移代码运行之后RealmRealm中的所有数据进行一些更改之后,哪里是遍历Realm中所有记录的好地方。

更具体地说,我需要遍历记录的主要原因是因为我当前正在使用String属性来存储quantities,如下所示……2 pcs,不要问我为什么,但是现在我需要从数量值中删除pcs,只剩下2才能将属性更改为Int或{{1} }。我知道我知道,使用字符串存储数量真是愚蠢。

1 个答案:

答案 0 :(得分:1)

使用AppDelegate的disFinishLaunchWithOptions方法编写迁移代码。

请参考以下参考文献:

realm.io official docs

本地迁移:

  

本地迁移是通过设置来定义的   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")
            }
        })