领域对象服务器:声明left.optional == right.optional(在Android和iOS之间同步数据)失败

nbo*_*ans 5 realm swift

我正在尝试在iOS应用程序和Android应用程序之间同步数据.Android应用程序可以从Realm中读取就好了,但是我的Swift程序正在挣扎,并且错误信息不是很有用.

我收到此错误消息:

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

我不知道它意味着什么或如何解决它.这是我使用Realm Object服务器验证自己的方式:

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()
}
Run Code Online (Sandbox Code Playgroud)

我看到输出被打印到控制台,所以我知道登录尝试是成功的.我不认为这是一个不匹配的数据库的问题,因为我将deleteRealmIfMigrationNeeded标志设置为true.

此错误消息的含义是什么?如何解决?

可以在此处找到相应的对象领域服务器日志:http://pastebin.com/raw/J9mU4H0u - 我为异地链接道歉,但这是一个很长的日志文件.

我的Swift模型如下:

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 = ""
}
Run Code Online (Sandbox Code Playgroud)

Android机型:

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;
}
Run Code Online (Sandbox Code Playgroud)

提前致谢!

nbo*_*ans 6

弄清楚发生了什么.显然,根据定义,Java可以String为空(或者Optional如果您愿意).在Swift中,我告诉我的模型映射到非Optional字符串.这就是为什么错误消息说它没有断言left.optional == right.optional.

因此,我必须做的就是String在我的快速模型中制作每一个optional.

看这里:

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?
}
Run Code Online (Sandbox Code Playgroud)