【问题标题】:Realm object server: failed asserting left.optional == right.optional (sync data between Android & iOS)领域对象服务器:断言 left.optional == right.optional 失败(在 Android 和 iOS 之间同步数据)
【发布时间】:2016-11-08 17:04:44
【问题描述】:

我正在尝试在我的 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

我不知道这意味着什么或如何解决它。 这就是我向领域对象服务器验证自己的方式:

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

我看到输出被打印到控制台,所以我知道登录尝试是成功的。我不认为这是数据库不匹配的问题,因为我将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 = ""
}

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

提前致谢!

【问题讨论】:

    标签: swift realm


    【解决方案1】:

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

    所以,我必须做的就是在我的 swift 模型 optional 中制作每个 String)。

    看这里:

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

    【讨论】:

    • 很好地找到了!我在我们关于与 Realm 移动平台的交叉兼容性的内部讨论中强调了这一点,我们将在未来努力使这一点更加明显。感谢分享! :)
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多