Search code examples
swift2xcode7realmrealm-migration

Could not cast value of type 'RealmSwift.DynamicObject' to MyCustomObject during migration


During RealmSwift migration, i want to migrate from dynamic var customObject: CustomObject to let customObjectList = List<CustomObject>(). CustomObject is type of Object

This is the chunk of code within migration

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

Could not cast value of type 'RealmSwift.DynamicObject' (0x1015c82d0) to 'AppName.CustomObject' (0x1006e5550).

How do i achieve what i want? Currently what i can think of is to create a CustomObject & manually assign the values to it.

EDIT 1

I want to add a primaryKey to CustomObject. I keep getting duplicate primary key error, i'm pretty sure the key assigned is unique.

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Primary key property 'resultKey' has duplicate values after migration."

 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)               

 }

EDIT 2

I manage to figure out what is the error by making resultKey not a primary key. The app runs perfectly and when i open .realm to see the values, there are some fields with "" under resultKey -> The duplicated primary key. ><


Solution

  • I think what you'd like to do is like following:

    Delete all CustomObject data if needed, because Migration List object cannot append existing objects.

    Then you can enumerate User objects, and create each CustomObject from User's property. And new User object has customObject property, then append the CustomObject object to the list.

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