2016-11-08 4 views
5

Ich versuche, Daten zwischen meiner iOS-Anwendung und Android-Anwendung zu synchronisieren. Die Android-Anwendung kann aus dem Realm einfach lesen, aber mein Swift-Programm hat Probleme, und die Fehlermeldung ist nicht sehr informativ.Realm-Objekt-Server: fehlgeschlagen Assertion left.optional == right.optional (Daten zwischen Android und iOS synchronisieren)

Ich erhalte diese Fehlermeldung:

2016-11-08 08:53:43.919 iOSRealm[2629:65667] Sync: Connection[1]: Session[1]: Bad changeset received: Assertion failed: left().nullable == right().nullable 

Ich habe keine Ahnung, was es bedeutet, oder wie man es beheben. Dies ist, wie ich mich authentifizieren mit dem Realm Object Server:

private func synchronouslyLogInUser() throws { 
    SyncUser.authenticateWithCredential(Credential.usernamePassword(username, password: password, actions:.UseExistingAccount), authServerURL: authURL) { (user, error) in 
     print("sent login request") 
     if let user = user { 
      print("user was not nil") 
      self.setDefaultRealmConfiguration(user) 
     } 
     if let error = error where error.code == SyncError.HTTPStatusCodeError.rawValue && (error.userInfo["statusCode"] as? Int) == 400 { 
      print("invalid user and pass") 
     } else { 
      print(error) 
     } 
    } 
} 

private func setDefaultRealmConfiguration(user: SyncUser) { 
    Realm.Configuration.defaultConfiguration = Realm.Configuration(syncConfiguration: (user, realmURL), objectTypes: [Weather.self, Wind.self]) 
    Realm.Configuration.defaultConfiguration.deleteRealmIfMigrationNeeded = true 
    realm = try! Realm() 
} 

Ich sehe auf der Konsole gedruckt wird, so dass ich die Anmeldeversuch wissen erfolgreich war. Ich glaube nicht, dass es ein Problem mit einer nicht übereinstimmenden Datenbank ist, weil ich das Flag deleteRealmIfMigrationNeeded auf true gesetzt habe.

Was bedeutet diese Fehlermeldung und wie behebe ich sie?

Die entsprechenden Object Realm Server-Protokolle finden Sie hier: http://pastebin.com/raw/J9mU4H0u - ich entschuldige mich für den externen Link, aber es ist eine lange Protokolldatei.

Meine Swift-Modelle sind wie folgt:

class Weather : Object { 
    dynamic var id = 0 
    dynamic var date = "" 
    dynamic var forecast = "" 
    dynamic var humidity = "" 
    dynamic var wind: Wind! 

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

class Wind: Object { 
    dynamic var direction = "" 
    dynamic var speed = "" 
} 

Android-Modelle:

public class Weather extends RealmObject { 
    @PrimaryKey 
    public int id; 
    public String date; 
    public String forecast; 
    public String humidity; 
    public Wind wind; 
} 

public class Wind extends RealmObject { 
    public String direction; 
    public String speed; 
} 

Vielen Dank im Voraus!

Antwort

6

Herausgefunden, was los war. Offenbar ist Java String NULL-fähig (oder Optional, wenn Sie möchten) per Definition. In Swift habe ich meinem Modell gesagt, dass es nicht zu Strings passen soll. Aus diesem Grund wurde in der Fehlernachricht angegeben, dass es fehlgeschlagen ist, left.optional == right.optional zu bestätigen.

Also, was ich tun musste, um es zu beheben, war jede String in meinem schnellen Modell optional).

Siehe hier:

class Weather : Object { 
    dynamic var id = 0 
    dynamic var date: String? 
    dynamic var forecast: String? 
    dynamic var humidity: String? 
    dynamic var wind: Wind? 

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

class Wind: Object { 
    dynamic var direction: String? 
    dynamic var speed: String? 
} 
+0

Schön gefunden! Ich habe dies in unseren internen Diskussionen bezüglich der Kompatibilität mit der Realm Mobile Platform hervorgehoben und wir werden versuchen, dies in Zukunft deutlicher zu machen. Danke für das Teilen! :) – TiM

Verwandte Themen