Cześć mam migrację królestwa, ale spełniłem błąd

Poniżej znajduje się mój scenariusz błędu sytuacji

Pierwszy

Mam prosty model Schemeversion 0 (domyślnie)

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

Dodaj dat2 w wersji 1

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

I migrodować

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

I dodaj date3 w wersji 3 i zmień nazwę Date3 do daty 4 w wersji 4

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

I migrodować

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

Kiedy migrowałem sekwenvely 0 -> 1 -> 2 -> 3 -> 4 działa dobrze

Ale gdy migruje z wersji 0 do 4 wersji Przyczyna fatal error: 'try!' expression unexpectedly raised an error

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

W tym przypadku, jak mogę migrować wersji 0 ~ 3 do 4 bez wyżej, a nie istnieje poszukiwanie?

1
Cruz 15 luty 2017, 17:12

2 odpowiedzi

Najlepsza odpowiedź

Jeśli Schemaversion 3 jest tylko taki, który ma "daty3", wersja 3 musi być obsługiwana oddzielnie (nie wiem, co się dzieje w Schemaversion 2). I nie możesz wstawić OldObject ["Date2"] do NewObject ["Date3"], ponieważ NewObject nie ma daty3 jako błędu. Celem migracji pasuje do Oldscheme z obecnym schemacją. Wypróbuj w swoim projekcie, działał ze mną!

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

I polecam, abyś użył funkcji EnimeerObjects raz. Nie musisz pobierać wszystkich obiektów za każdym razem. Mam nadzieję, że to zadziała!

2
Mijeong.J 2 kwiecień 2017, 05:20

Potrzebujesz migracji dla każdej właściwości, która będzie istnieć w ostatecznej wersji schematu, ale nie była w oryginale, ponieważ Realm musi dodać tę nieruchomość do wszystkiego, co już masz w bazie danych (właśnie to robi migracja - wypełni to dziury). Dlaczego chcesz usunąć kod, który działa? Dostajesz wyjątek na DATE3, ponieważ nie istnieje w schemacie 0, a ty mówisz, że chcesz przejść bezpośrednio od 0 do 4 ... Możesz albo zacząć od pełnych definicji dla wszystkich właściwości i przeładować wszystkie dane od podstaw bez migracja lub pozostaw swój kod pracy, jak to jest. Nie ma w tym nic złego. Zapytaj mnie o wszystko, czego nie wyjaśniłem wystarczająco.

0
Mozahler 15 luty 2017, 14:30