首页 文章

使用可选字符串属性更新Realm对象为nil?

提问于
浏览
2

我有一个定义如下的Realm模型:

class Contact: Object {
   dynamic var id: -1
   dynamic var alias: String?

   override static func primaryKey() -> String? {
      return "id"
   }
}

我的代码从服务器下载JSON,并在我的Realm数据库中添加/更新联系人 . 在JSON反序列化之后,我最终得到了一个联系对象数组 . 我遍历数组并检查每个联系人是否已经在数据库中,如果是,那么'alias'属性是否与反序列化对象上的值匹配 . 为了举例,我们假设我的数据库中有一个“别名”属性值为“John Smith”的联系人 . 下次从服务器获取更新数据时,此联系人的JSON中现在缺少“alias”属性,因此我的反序列化联系对象上的.alias属性将为nil . 现在我需要更新Realm中的现有联系人,因此它的.alias属性也是nil(而不是“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并将其更新为String值(如“John Smith”)时,此代码按预期工作 . 谁能告诉我我做错了什么?我认为,因为别名被声明为可选的String,我能够将它更新为nil的值吗?

Update:

我只是在调用 realm.create() 之前尝试手动设置 contactFromServer.alias = "TEST" ,而我显然在这里做错了 . :-(

1 回答

  • 2

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

相关问题