swift - 将可选字符串属性的 Realm 对象更新为零?

标签 swift realm

我定义了一个 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/

相关文章:

ios - 无法在 Swift 中调用 Obj-c 中定义的函数

ios - UIScrollView 嵌入导航 Controller 时表现不同

swift - CoreData 编辑行

swift2 - 为 Swift 2.0 实例化 Realm 数据库 - 最佳实践?

android - 使用 RealmMigration 在 Realm Android 中将数据类型从 String 更改为 Long

android - Realm 中区分大小写的过滤器

ios - Swift 在字符的第一个匹配处拆分字符串

ios - 使用日期选择器的本地 UNMutableNotificationContent 触发日期

ios - 从 RLMResults 中移除对象

swift - Swift 关系中的 Realm 不添加行