【发布时间】:2016-10-19 18:20:11
【问题描述】:
我有一个这样定义的 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 属性将为零。现在我需要更新 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 属性为 nil 并且我将其更新为字符串值(如“John Smith”)时,此代码按预期工作。谁能告诉我我做错了什么?我以为既然 alias 被声明为可选字符串,我就可以将其更新为 nil 的值?
更新:
我刚刚尝试在调用realm.create() 之前手动设置contactFromServer.alias = "TEST",但我仍然遇到同样的异常(只需将上面错误消息中的'nil' 替换为Optional("TEST"))。我显然在这里做错了什么。 :-(
【问题讨论】: