2016-05-23 6 views
2

Ich versuche Realm.IO Migration aus dem folgenden Modell auszuführen:Optional Int Eigenschaft enthält nil statt Null bei der Migration

public class RealmBuddy: Object { 
    dynamic var id = 0 
    let contactId = RealmOptional<Int>() 
    dynamic var name = "" 
    let topics = List<RealmTopic>() 

    override static func primaryKey() -> String? { 
     return "id" 
    } 
} 

auf die folgenden:

public class RealmBuddy: Object { 
    dynamic var id = 0 
    dynamic var contactId: String? = nil 
    dynamic var name = "" 
    let topics = List<RealmTopic>() 

    override public static func primaryKey() -> String? { 
     return "id" 
    } 
} 

Wie Sie sehen können, Die einzelne Änderung hat den Typ contactId: optional Int sollte in optional String konvertiert werden. Ich habe es wie folgt umgesetzt:

if (oldSchemaVersion < 1) { 
    migration.enumerate(RealmBuddy.className()) { oldObject, newObject in 
     if let contactId = oldObject!["contactId"] as? Int { 
      newObject!["contactId"] = "\(contactId)" 
     } 
    } 
} 

Allerdings habe ich festgestellt, dass nach der Migration meine Einheiten, die keine ContactID hatte (das heißt nil Wert) jetzt gleich ContactID auf „0“ string. Es scheint, dass oldObject! ["ContactId"] 0 anstelle von nil zurückgibt.

Ich habe keine Informationen oder Beispiele zur Durchführung dieser einfachen Aufgabe gefunden, also bin ich nicht sicher, ob ich den Wert richtig abrufen/werfen (versuchte auch RealmOptional<Int> zu übertragen), also habe ich mich entschieden, hier nachzufragen bevor Sie eine Ausgabe auf GitHub einreichen. Ist es ein Fehler oder erwartetes Verhalten? Wenn es erwartetes Verhalten ist, wie man Wert richtig erhält?

PS: Mein Projekt ist Open-Source, weil ich auf iOS bin neu und entwickeln es für Selbsterziehung, so schob ich es auf eine repo wo das Problem kann leicht reproduziert werden (bitte beachten Sie, dass es in migration_issue Zweig). Ich machte auch eine unit test mit bestehenden .realm Datei, die während des Tests zu neuen Schema migriert. Hoffe das wird helfen.

PPS: Ich habe versucht, 0.102.1 und 0.103.1 Versionen der Bibliothek.

PPPS: Es wurde erwähnt, dass der Realm Browser keine contactId mit dem Wert nil in meiner realm-Beispieldatei anzeigt. Ich denke, es ist nur Realm Browser Problem, so dass ich eine andere unit test in separaten Zweig, um zu beweisen, dass die alte Datenbank Nullwert hat.

Antwort

0

Es war ein Fehler. Siehe https://github.com/realm/realm-cocoa/pull/3643. In 0.103.2 behoben.

Optional Eigenschaften von skalaren Typen waren immer den falschen Objective-C Typ-Code, die dynamischen Zugriffs führten den nicht-optionale Codepfad nehmen. Dies führte dazu, dass keine Werte als 0 zurückgegeben wurden.

0

Wenn ich Standard-v0.realm im Realm Browser öffne, sehe ich keine Zeilen mit Null contactId. Wenn Sie erwarten, dass es einen gibt, liegt das Problem in dem Code, der anfänglich den Bereich und nicht den Migrationscode gefüllt hat.

+0

Ich hatte auch diese Idee, als ich versuchte, die Datenbank im Realm Browser zu öffnen. Wenn ich jedoch eine .realm-Datei über Code lade, ist * * kein Wert - Datensatz mit dem Namen "Roman Petrenko" hat es. Ein anderer Kontakt ("Kate Bell") hat contactId == 1. Also ich denke Realm Browser kann nur noch keine Nullwerte anzeigen. –

+0

Ich habe meine Antwort und Repo aktualisiert, um das Vorhandensein von Nullwerten in default-v0.realm zu demonstrieren –

Verwandte Themen