我定义了一个 Realm 模型,如下所示:
class Contact: Object {
dynamic var id: -1
dynamic var alias: String?
override static func primaryKey() -> String? {
return "id"
}
}
我的代码从服务器下载 JSON 并在我的 Realm 数据库中添加/更新联系人。 JSON 反序列化后,我最终得到了一组联系人对象。我迭代数组并检查每个联系人是否已在数据库中,如果是,则它的“别名”属性是否与反序列化对象上的值匹配。举例来说,我们假设我的数据库中有一个联系人,其“别名”属性值为“John Smith”。下次我从服务器获取更新的数据时,该联系人的 JSON 中现在缺少“alias”属性,因此我的反序列化联系人对象上的 .alias 属性将为 nil。现在我需要更新 Realm 中的现有联系人,因此它的 .alias 属性也为零(而不是“John Smith”)。我尝试按如下方式执行此操作:
// existingContact.alias = "John Smith"
// contactFromServer.alias = nil
if existingContact.alias != contactFromServer.alias {
try realm.write {
realm.create(Contact.self, value: ["id" : contactFromServer.id, "alias" : contactFromServer.alias], update: true)
}
}
当此代码执行时,我收到一个 RLMException,指示“属性‘alias’的值‘nil’无效”。当现有联系人的 .alias 属性为零并且我将其更新为字符串值(如“John Smith”)时,此代码按预期工作。谁能告诉我我做错了什么?我认为既然 alias 被声明为可选字符串,我就能够将其更新为 nil 值?
更新:
我刚刚尝试在调用 realm.create()
之前手动设置 contactFromServer.alias = "TEST"
,但仍然遇到相同的异常(只是将上面的错误消息中的“nil”替换为Optional(“TEST”)。我显然在这里做错了什么。 :-(
最佳答案
这是由于当 nil
桥接到 Any
时 Swift 3.0 存在限制。 SE-0140在 Swift 3.0.1 中,通过将 nil
桥接到 NSNull()
来解决这个问题。同时,您可以通过指定 contactFromServer.alias ?? 自行执行此操作。 NSNull()
:
if existingContact.alias != contactFromServer.alias {
try realm.write {
realm.create(Contact.self, value: ["id" : contactFromServer.id, "alias" : contactFromServer.alias ?? NSNull()], update: true)
}
}
关于swift - 将可选字符串属性的 Realm 对象更新为零?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/40138838/