2016-01-04 3 views
11
let config = Realm.Configuration(
     // Set the new schema version. This must be greater than the previously used 
     // version (if you've never set a schema version before, the version is 0). 
     schemaVersion: 1, 

     // Set the block which will be called automatically when opening a Realm with 
     // a schema version lower than the one set above 
     migrationBlock: { migration, oldSchemaVersion in 
      // We haven’t migrated anything yet, so oldSchemaVersion == 0 
      if (oldSchemaVersion < 1) { 
       // Nothing to do! 
       // Realm will automatically detect new properties and removed properties 
       // And will update the schema on disk automatically 
      } 
    }) 

    // Tell Realm to use this new configuration object for the default Realm 
    Realm.Configuration.defaultConfiguration = config 

    // Now that we've told Realm how to handle the schema change, opening the file 
    // will automatically perform the migration 
    let realm = try! Realm() 

funktioniert die in Anwendung gebracht wurde (Anwendung: didFinishLaunchingWithOptions :)Realm Migration nicht

In meinem Testprogramm habe ich die Felder in meinem Objekt verändert. Ich möchte alles in der Datenbank entfernen und zu den neuen Feldtypen wechseln. Ich habe den obigen Code aus der Dokumentation kopiert, scheint aber nichts zu tun. Ich bekomme immer noch diese Fehler:

fatal error: 'try!' expression unexpectedly raised an error: Error Domain=io.realm Code=0 "Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int' 
- Property 'reps' has been added to latest object model." UserInfo={NSLocalizedDescription=Migration is required due to the following errors: 
- Property types for 'unit' property do not match. Old type 'string', new type 'int' 
- Property 'reps' has been added to latest object model.}: file /Library/Caches/com.apple.xbs/Sources/swiftlang/swiftlang-700.1.101.15/src/swift/stdlib/public/core/ 

Irgendwelche Ideen?

+1

'schemaVersion' muss größer sein als die zuvor verwendete Version. Es scheint, dass die aktuelle Schemaversion größer als 1 ist. Können Sie versuchen, eine größere Zahl an den Parameter schemaVersion zu übergeben? –

Antwort

3

Solange Sie nur in lokaler Entwicklung sind, würde ich empfehlen, Ihre Realm-Datenbank zurückzusetzen, anstatt eine Migration durchzuführen. Migrationen sind der richtige Weg, wenn Sie bereits eine Version Ihrer App mit einem anderen Schema ausgeliefert haben und Benutzerdaten behalten möchten.

Sie können die Datenbank löschen, indem Sie die App aus dem Simulator oder dem Gerät löschen. Alternativ können Sie NSFileManager verwenden, um die Realm-Datei vor dem Zugriff auf die Datenbank zu löschen.

let defaultPath = Realm.Configuration.defaultConfiguration.path! 
try NSFileManager.defaultManager().removeItemAtPath(defaultPath) 
+4

Dies geht nicht auf das eigentliche Problem ein, sondern es wird lediglich empfohlen, Migrationen für Produktionsanwendungen zu verwenden. – codepushr

1

Ich bekomme oft auch den gleichen fatalen Fehler. Dies geschieht normalerweise, wenn Sie Änderungen an Realm-Objekten mit einem "Primärschlüssel" vornehmen. Die schnellste und einfachste Lösung besteht darin, die App einfach vom Gerät oder Simulator zu löschen. Führen Sie Ihr Projekt dann erneut aus.

+0

Wie ist es, wenn sich Ihre App auf dem Gerät eines Remotebenutzers befindet? Was machst du dann? – lwdthe1

0

Sind Sie sicher, dass Sie Ihre schemaVersion korrekt aktualisiert haben? Wenn Sie schemaVersion: 1 festlegen, bevor Sie Änderungen vorgenommen haben, müssen Sie sie in 2 ändern, damit die Migration ausgelöst wird.

2

Stellen Sie sicher, dass Sie nicht versuchen, die Instanz von Realm() zu instanziieren, bevor die Migrationskonfiguration in application(application:didFinishLaunchingWithOptions:) festgelegt wird. Wenn es abstürzt, überprüfen Sie den Ausführungsstapel, um festzustellen, welche Instanz die Ausnahme ausgelöst hat. Ich hatte den gleichen Fehler, in meinem Fall wurde Realm-Instanz in einem meiner View-Controller instanziiert, bevor der Migrationsblock gesetzt wurde.

Viel Glück

9

Ich hatte ein ähnliches Problem geschieht, wenn meine app trotz der Tatsache, abstürzen würde, dass ich die Standard-Migrationscode in didFinishLaunchingWithOptions

Das Problem war, fügte hinzu, dass ich in der Tat eine Instanz von Realm wurde initialisiert in meine erste View-Controller als eine Eigenschaft auf Klassenebene. Das Entfernen dieses Realmobjekts auf Klassenebene von meinem ersten ViewController hat das Problem behoben.

Ich habe stattdessen das Objekt innerhalb der Funktion, die es benötigt, erstellt, die ein besserer Ansatz ist sowieso.

+1

Kann bestätigen, dass dies das Problem war, das ich auch hatte, danke! – Luis

+1

Das kann ich auch bestätigen – lwdthe1

+1

Das hat mich gerettet! Ich habe Realm in meinem Start-View-Controller instanziiert. Ich habe die Instanziierung nach viewDidAppear verschoben, und jetzt läuft meine Migration! Danke –