2016-11-08 12 views
5

Próbuję przeprowadzić synchronizację danych między aplikacją iOS a aplikacją na Androida. Aplikacja dla systemu Android może odczytywać z obszaru Realm, ale mój program Swift ma problemy, a komunikat o błędzie nie jest zbyt pouczający.Serwer obiektów Realm: nie powiodło się twierdzenie left.optional == right.optional (dane synchronizacji między systemem Android i iOS)

otrzymuję komunikat o błędzie:

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

Nie mam pojęcia, co to znaczy i jak to naprawić. To jak ja uwierzytelnić się z serwerem Realm obiektu:

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

widzę wyjście jest wypisywane na konsoli więc wiem próba logowanie było udane. Nie sądzę, że jest to problem z niedopasowaną bazą danych, ponieważ ustawiam flagę deleteRealmIfMigrationNeeded na true.

Co oznacza ten komunikat o błędzie i jak go naprawić?

Odpowiednie dzienniki serwera obiektów nieruchomych można znaleźć tutaj: http://pastebin.com/raw/J9mU4H0u - przepraszam za link poza witryną, ale jest to długi plik dziennika.

Kim Swift modeli są następujące:

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 modele:

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

Z góry dzięki!

Odpowiedz

6

Dowiedziała się, co się dzieje. Apparantly, Java String jest z definicji zerowy (lub Optional). W Swift powiedziałem mojemu modelowi, aby odwzorowywał ciągi inne niż Optional. Właśnie dlatego komunikat o błędzie informował, że nie udało się potwierdzić tego left.optional == right.optional.

To, co musiałem zrobić, aby to naprawić, to sprawić, że każdy String w moim szybkim modelu optional).

Zobacz tutaj:

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

Ładnie znaleziony! Podkreśliłem to w naszych wewnętrznych dyskusjach dotyczących kompatybilności krzyżowej z Realm Mobile Platform, a postaramy się uczynić to bardziej oczywistym w przyszłości. Dzięki za udostępnienie! :) – TiM

Powiązane problemy