【问题标题】:Could not cast value of type 'RealmSwift.DynamicObject' to MyCustomObject during migration迁移期间无法将“RealmSwift.DynamicObject”类型的值转换为 MyCustomObject
【发布时间】:2015-10-26 04:37:59
【问题描述】:

RealmSwift migration 期间,我想从dynamic var customObject: CustomObject 迁移到let customObjectList = List<CustomObject>()CustomObjectObject 的类型

这是迁移中的代码块

let newList = List<CustomObject>()
if oldObject!["customObject"] != nil {

   print(oldObject!["customObject"])                  
   var obj = oldObject!["customObject"]
   var result: CustomObject = obj as! CustomObject //Crash
   farList.append(result)
}

newObject!["customObjectList"] = newList

无法将“RealmSwift.DynamicObject”(0x1015c82d0)类型的值转换为“AppName.CustomObject”(0x1006e5550)。

我如何实现我想要的?目前我能想到的是创建一个 CustomObject 并手动为其分配值。

编辑 1

我想向CustomObject 添加一个primaryKey。我不断收到重复的主键错误,我很确定分配的键是唯一的。

致命错误:“试试!”表达式意外引发错误:错误域 = io.realm 代码 = 0“主键属性 'resultKey' 在迁移后具有重复值。”

 migration.deleteData(CustomObject.className())

 if oldObject!["customObject"] != nil {
          let oldSubFar = oldObject!["customObject"] as! MigrationObject
          var newFarDict = oldSubFar.dictionaryWithValuesForKeys(["firstName","secondName"])
          newFarDict["resultKey"] = NSUUID().UUIDString + "v1"


          let newSubFar = migration.create(CustomObject.className(), value: newFarDict )
          print(newSubFar) //its the updated object that i want
          let subFarList = newObject!["customObjectList"] as! List<MigrationObject>         

          subFarList.append(newSubFar)               

 }

编辑 2

我设法通过使resultKey 不是主键来找出错误所在。该应用程序运行完美,当我打开.realm 以查看值时,resultKey 下的某些字段带有"" -> 重复的主键。 >

【问题讨论】:

    标签: swift2 xcode7 realm realm-migration


    【解决方案1】:

    我认为你想做的如下:

    如果需要,删除所有 CustomObject 数据,因为迁移列表对象无法附加现有对象。

    然后你可以枚举User对象,并从User的属性创建每个CustomObject。并且新的User 对象具有customObject 属性,然后将CustomObject 对象附加到列表中。

    migration.deleteData(CustomObject.className()) // If needed
    
    migration.enumerate(User.className()) { oldObject, newObject in
        if let oldObject = oldObject,
            let newObject = newObject {
                let oldCustomObject = oldObject["customObject"] as! MigrationObject
                let newCustomObject = migration.create(CustomObject.className(), value: oldCustomObject)
    
                let customObjectList = newObject["customObjectList"] as! List<MigrationObject>
                customObjectList.append(newCustomObject)
        }
    }
    

    【讨论】:

    • 如何修改MigrationObject?假设我想添加新值
    • 使用migration.create() 添加新对象。使用newCustomObject["name"] = "..." 之类的下标或将值作为create() 方法的参数传递以添加新值。我可以回答你的问题吗?如果没有,您能否将更多详细信息作为新问题发布?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-11-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-07-27
    相关资源
    最近更新 更多