【问题标题】:Updating Realm object with optional string property to be nil?将具有可选字符串属性的领域对象更新为零?
【发布时间】: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"))。我显然在这里做错了什么。 :-(

【问题讨论】:

    标签: swift realm


    【解决方案1】:

    这是由于 Swift 3.0 的限制,当 nil 桥接到 Any 时。 SE-0140 在 Swift 3.0.1 中通过桥接 nilNSNull() 解决了这个问题。同时,您可以通过指定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)
        }
    }
    

    【讨论】:

    • 感谢您的信息!当我进行此更改时,编译器给我这个错误:“上下文类型'Any'不能与字典文字一起使用”
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-10-23
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多