跳过架构版本时,领域迁移会引发“无效的属性名称”异常

问题描述

在我的iOS应用中使用RealmSwift时,如果用户跳过了一个或多个版本,则会遇到将已安装的领域架构迁移到当前架构版本的问题。

初始架构版本0:

// Schema Version 0
class ParentObject: Object {
  @objc dynamic var child: Childobject!
}

class Childobject: Object {
  @objc dynamic var name = ""
}

更改为版本1:

// Schema Version 1
class ParentObject: Object {
  @objc dynamic var child: Childobject!
}

class Childobject: Object {
  @objc dynamic var name = ""
  @objc dynamic var isEnabled = false
}

更改为版本2:

// Schema Version 2
class ParentObject: Object {
  @objc dynamic var child: Childobject!
  @objc dynamic var isEnabled = false
}

class Childobject: Object {
  @objc dynamic var name = ""
}

迁移块如下:

func migrationBlock(migration: Migration,oldSchemaVersion: UInt64) {

  if oldSchemaVersion < 1 {
    migration.enumerateObjects(ofType: "Childobject") { oldobject,newObject in
      newObject!["isEnabled"] = Bool.random()
    }
  }

  if oldSchemaVersion < 2 {
    migration.enumerateObjects(ofType: "ParentObject") { oldobject,newObject in
      if let child = oldobject!["child"] as? MigrationObject {
        newObject["isEnabled"] = child["isEnabled"] as! Bool
      }
    }
  }

}

如果已安装的架构版本为0,并且应用程序立即更新为2,则出现以下错误

*** Terminating app due to uncaught exception 'RLMException',reason: 'Invalid property name 'isEnabled' for class 'Childobject'.'

我了解为什么会发生这种情况,但我想知道是否不能仅增量地添加新的迁移步骤?似乎对于每个模式更改,我都必须手动完成每个上一步,以检查是否可能不再起作用,这会使整个过程更容易出错。

我在android副本中具有相同的架构更改,但是由于必须在java / kotlin中手动对架构更改进行建模,因此这似乎不是问题。

处理此类情况的最佳实践是什么?

解决方法

暂无找到可以解决该程序问题的有效方法,小编努力寻找整理中!

如果你已经找到好的解决方法,欢迎将解决方案带上本链接一起发送给小编。

小编邮箱:dio#foxmail.com (将#修改为@)