【问题标题】:Realm: Update Object without updating lists领域:更新对象而不更新列表
【发布时间】:2017-01-18 14:17:03
【问题描述】:

有没有办法更新一个对象而不用 ObjectMapper 删除它的列表?

例如:

我有一个User 模型:

class User: Object, ObjectMapper {
  dynamic var id: Int = 0
  dynamic var name: String = ""

  var locations = List<Location>()

  convenience required init?(map: Map) {
  }

  func mapping(map: Map) {
    id        <- map["id"]
    name      <- map["name"]
    locations <- (map["locations"], ListTransform<Location>())
  }
}

现在,如果我从服务器获取用户数据,出于效率原因,我不会每次都获取位置。但是,如果我在没有他们的情况下初始化用户并将其保存为add(user, update: true),则所有位置都会被删除,因为在 JSON 数据中找不到任何位置。

什么是更新用户对象的属性而不是它的关系的最好和最干净的方法?

【问题讨论】:

    标签: ios swift realm objectmapper


    【解决方案1】:

    您应该从 Realm 获取现有用户,然后更改其属性,这样您就可以保留以前保存的位置。

    【讨论】:

      【解决方案2】:

      空值仍被视为有效输入,因此如果您传入一个 JSON 字符串,其中 locations 存在但为空,Realm 假设这意味着您要删除其中的所有内容。

      避免这种情况的最简单方法是确保没有将名为 locations 的空键传递给 Realm。 Realm 只会更新您明确提供的属性。如果它存在,您可以尝试从 JSON 文件中删除它,或者如果检测到它为空,则修改您的 ObjectMapper 逻辑以跳过它。

      【讨论】:

      • 你能解释一下如何让 ObjectMapper 跳过空字段吗? ObjectMapper 默认使用空字段初始化对象,即使我指定我想在映射中忽略Nils。因此,当我解析响应时,我得到一个带有一些空字段的新对象,并将它传递给领域以更新/合并现有对象,这会覆盖我现有的字段。
      • 嗯。对不起。我不太确定。如果 ObjectMapper 显式初始化每个字段,即使它没有在 JSON 中提供,那么这将与 Realm 假定要触摸哪些字段的方式发生冲突。我建议您看看是否可以查看 ObjectMapper 的代码,看看是否有办法禁用该行为。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2018-02-08
      • 1970-01-01
      相关资源
      最近更新 更多