微信公众号搜"智元新知"关注
微信扫一扫可直接关注哦!

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

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

在我的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 举报,一经查实,本站将立刻删除。