Swift中的Realm迁移

Cod*_*ver 13 migration data-migration realm data-management swift

我有一个Realm Object建模如此

class WorkoutSet: Object {
     // Schema 0
     dynamic var exerciseName: String = ""
     dynamic var reps: Int = 0
     // Schema 0 + 1
     dynamic var setCount: Int = 0
}
Run Code Online (Sandbox Code Playgroud)

我正在尝试执行迁移.

在我的AppDelegate导入内RealmSwift.

didFinishLaunchWithOptions我调用的函数内

Migrations().checkSchema()
Run Code Online (Sandbox Code Playgroud)

迁移是在另一个文件中声明的类.

在该文件中有一个声明为这样的结构.

func checkSchema() {
    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
            switch oldSchemaVersion {
            case 1:
                break
            default:
                // Nothing to do!
                // Realm will automatically detect new properties and removed properties
                // And will update the schema on disk automatically
                self.zeroToOne(migration)
            }
    })
}

func zeroToOne(migration: Migration) {
    migration.enumerate(WorkoutSet.className()) {
        oldObject, newObject in
        let setCount = 1
        newObject!["setCount"] = setCount
    }
}
Run Code Online (Sandbox Code Playgroud)

添加setCount到模型时出错

Shr*_*ada 28

您需要调用迁移.仅仅创建一个配置,不会调用它.有两种方法可以做到这一点:

  1. 将迁移设置为Realm的默认配置 -

    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
    
        if oldSchemaVersion < 1 {
          migration.enumerate(WorkoutSet.className()) { oldObject, newObject in
            newObject?["setCount"] = setCount
          }    
        }
      }
    ) 
    Realm.Configuration.defaultConfiguration = config   
    
    Run Code Online (Sandbox Code Playgroud)

要么

  1. 使用migrateRealm手动迁移:

migrateRealm(配置)

现在您的迁移应该正常运行.


kis*_*umi 5

因为你只是创建Realm.Configuration. 如果需要,Realm 会调用迁移块。您不能直接调用迁移。

所以要调用迁移块,你应该将配置对象设置为 Realm,或者设置为默认配置。然后创建 Realm 实例。

因此,您需要执行以下操作:

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
        switch oldSchemaVersion {
        case 1:
            break
        default:
            // Nothing to do!
            // Realm will automatically detect new properties and removed properties
            // And will update the schema on disk automatically
            self.zeroToOne(migration)
        }
})

let realm = try! Realm(configuration: config) // Invoke migration block if needed
Run Code Online (Sandbox Code Playgroud)

  • 不要调用`让领域=尝试!领域(配置:配置)`与力。出于某种原因将其标记为抛出(例如,设备上没有空间来执行迁移)。相反,您应该在 do-catch 块中调用它。 (7认同)