swift - Realm 对象服务器 : failed asserting left. optional == right.optional(在 Android 和 iOS 之间同步数据)

标签 swift realm

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

我不知道这意味着什么或如何修复它。 这就是我使用 Realm 对象服务器验证自己的方式:

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

此错误消息是什么意思,我该如何解决?

可在此处找到适当的对象 Realm 服务器日志: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 = ""
}

安卓机型:

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

提前致谢!

最佳答案

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

因此,我必须做的是让我的 swift 模型中的每个 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?
}

关于swift - Realm 对象服务器 : failed asserting left. optional == right.optional(在 Android 和 iOS 之间同步数据),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40492585/

相关文章:

ios - 我的主要场景中所有 IBOutlets 都是零

ios - 快速更改播放器

ios - 是否可以使用 MusicSequence 将 MusicPlayer 连接到 AVAudioUnitSampler?

ios - 如何更改类的属性而不必使用 Realm 删除应用程序

java - Android:从通知写入 Realm 数据库

swift - 你如何比较 Swift 中日期的时间?

swift - 数组中 "me"之前的对象

ios - 避免 Realm 数据库中自定义对象数组的重复。当主键仅存在于关系表中时

configuration - 如何解决卡在 "Realm Selection"的问题?

swift - 同步后无法加载 Realm 对象 : realm is empty despite writing