Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/ios/95.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Ios “领域迁移抛出”;无效的属性名称";跳过架构版本时发生异常_Ios_Swift_Realm_Realm Migration - Fatal编程技术网

Ios “领域迁移抛出”;无效的属性名称";跳过架构版本时发生异常

Ios “领域迁移抛出”;无效的属性名称";跳过架构版本时发生异常,ios,swift,realm,realm-migration,Ios,Swift,Realm,Realm Migration,在iOS应用程序中使用RealmSwift时,如果用户跳过了两个版本之间的一个或多个版本,则在将已安装的领域架构迁移到当前架构版本时遇到问题 初始架构版本0: //架构版本0 类ParentObject:Object{ @objc动态变量子对象:ChildObject! } 类ChildObject:Object{ @objc动态变量名称=“” } 已更改为第1版: //架构版本1 类ParentObject:Object{ @objc动态变量子对象:ChildObject! } 类Child

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

初始架构版本0:

//架构版本0
类ParentObject:Object{
@objc动态变量子对象:ChildObject!
}
类ChildObject:Object{
@objc动态变量名称=“”
}
已更改为第1版:

//架构版本1
类ParentObject:Object{
@objc动态变量子对象:ChildObject!
}
类ChildObject:Object{
@objc动态变量名称=“”
@objc动态变量isEnabled=false
}
更改为第2版:

//架构版本2
类ParentObject:Object{
@objc动态变量子对象:ChildObject!
@objc动态变量isEnabled=false
}
类ChildObject:Object{
@objc动态变量名称=“”
}
迁移块如下所示:

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
      }
    }
  }

}
我理解为什么会发生这种情况,但我想知道我是否不能增量地添加新的迁移步骤?看起来,对于每个模式更改,我都必须手动完成前面的每个步骤,以检查是否有什么东西可能不再工作,这使得整个过程更容易出错

我在android中也有相同的模式更改,但由于模式更改必须在java/kotlin中手动建模,因此似乎没有问题


处理这种情况的最佳实践是什么?

为清楚起见,如果新模式版本为2,旧模式<1,“新”子对象没有引发错误的
newObject的
isEnabled
属性![“isEnabled”]
。一种选择是基于数据的版本,而不是低于哪个版本。e、 g.如果newSchema=2和oldSchema=0,您知道子对象没有
isEnabled
属性,因此没有理由迁移它-只需将新的ParentObject isEnabled属性设置为Bool.random()。如果旧版本是1,那么您知道它存在,所以将旧的ChildObject isEnabled迁移到新的ParentObject isEnabled。
*** Terminating app due to uncaught exception 'RLMException', reason: 'Invalid property name 'isEnabled' for class 'ChildObject'.'