2017-02-15 3 views
1

Привет У меня есть миграции Realm, но имеют ошибку встретитьсяRealm версия Migration переименования собственности не существовало

ниже моей ситуации ошибка сценария

первый

У меня есть простой User Модель schemeVersion 0 (по умолчанию)

class User: Object { 
    dynamic var username = "" 
    dynmaic var date = NSDate() 
} 

добавить date2 в версии 1

class User: Object { 
    dynamic var username = "" 
    dynmaic var date = NSDate() 
    dynamic var date2 = NSDate() 
} 

и мигрировать

Realm.Configuration.defaultConfiguration = Realm.Configuration(
     schemaVersion: 1, 
     migrationBlock: { migration, oldSchemaVersion in 
      // We haven’t migrated anything yet, so oldSchemaVersion == 0 
      if oldSchemaVersion < 1 { 
       migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in 
        newObject!["date2"] = oldObject!["date"] as! NSDate 
       }) 
      } 
} 

и добавить date3 в версии 3 и переименовать date3 на сегодняшний день 4 в версии 4

class User: Object { 
    dynamic var username = "" 
    dynmaic var date = NSDate() 
    dynamic var date2 = NSDate() 
    dynamic var date4 = NSDate() 
} 

и мигрировать

Realm.Configuration.defaultConfiguration = Realm.Configuration(
     schemaVersion: 4, 
     migrationBlock: { migration, oldSchemaVersion in 
      // We haven’t migrated anything yet, so oldSchemaVersion == 0 
      if oldSchemaVersion < 1 { 
       migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in 
        newObject!["date2"] = oldObject!["date"] as! NSDate 
       }) 
      } 

      if oldSchemaVersion < 2 { 
       migration.enumerateObjects(ofType: RealmUser.className(), { (oldObject, newObject) in 
        newObject!["date3"] = oldObject!["date2"] as! NSDate 
       }) 
      } 

      if oldSchemaVersion < 3 { 
       migration.renameProperty(onType: User.className(), from: "date3", to: "date4") 
      } 
} 

Когда я мигрировали sequencely 0 -> 1 -> 2 -> 3 -> 4 работает нормально

но когда мигрирует от 0 до версии 4 версии причины fatal error: 'try!' expression unexpectedly raised an error

"Cannot rename property 'User.date3' because it does not exist."

в этом случае, как я могу мигрировать 0 ~ 3 версии 4 не выше, не существует Exeption?

ответ

2

Если schemaVersion 3 - это только тот, у которого есть «дата3», версия 3 должна обрабатываться отдельно (я не знаю, что происходит в schemaVersion 2). И вы не можете вставить oldObject ["date2"] в newObject ["date3"], потому что newObject не имеет дату3 как ошибку. Цель миграции - сопоставление старой схемы с настоящей схемой. Попробуйте в своем проекте, он работал со мной!

Realm.Configuration.defaultConfiguration = Realm.Configuration(
     schemaVersion: 4, 
     migrationBlock: { migration, oldSchemaVersion in 
     migration.enumerateObjects(ofType: User.className(), { (oldObject, newObject) in 
      if oldSchemaVersion < 1 { 
       newObject?["date2"] = oldObject!["date"] as! NSDate 
      } 
      // use newObject["date2"] instead of oldObject["date2"] for schemaVerion 0 
      if oldSchemaVersion < 2 { 
       newObject?["date4"] = newObject?["date2"] as! NSDate 
      } 
     }) 
     // separate version 3 for "date3" 
     if oldSchemaVersion == 3 { 
      migration.renameProperty(onType: User.className(), from: "date3", to: "date4") 
     } 
}) 

И я рекомендую использовать func enumerateObjects один раз. Вам не нужно каждый раз получать все объекты. Надеюсь, это сработает!

+0

это спасет мои времена Спасибо :) – Cruz

0

Вам необходимо выполнить миграцию для каждого свойства, которое будет существовать в окончательной версии вашей схемы, но не было в оригинале, поскольку Realm необходимо добавить это свойство ко всему, что у вас уже есть в базе данных (это то, что делает миграция - он заполняет отверстия). Почему вы хотите удалить код, который у вас есть, который работает? Вы получаете исключение для date3, потому что оно не существует в схеме 0, и вы говорите, что хотите перейти непосредственно от 0 до 4 ... Вы можете начать с полных определений для всех свойств и перезагрузить все свои данные с нуля без миграция или оставить рабочий код таким, какой он есть. в этом нет ничего плохого. Спросите меня обо всем, что я недостаточно объяснил.

+0

Я подумал о другом варианте для вас: если вы можете начать с заполненной БД, используйте копию вашей текущей базы данных (схема 4) в качестве вашей «версии 0» и удалите весь код перехода. и убедитесь, что у вас есть код, который заполняет дату3 и т. д. правильно на вставке (добавить). – Mozahler

Смежные вопросы