【问题标题】:Realm Swift - Nested lists in JSONRealm Swift - JSON 中的嵌套列表
【发布时间】:2020-08-27 22:06:08
【问题描述】:

我的服务有这个 JSON 响应,我需要映射它以便将其保存在我的 Realm 数据库中。

{
  "Customers": [
    {
      "ID": 1,
      "Name": "Customer 1",
      "Contacts": [
        {
          "ID": 1,
          "Name": "Contact A",
        },
        ...
      ]
    },
    {
      "ID": 2,
      "Name": "Customer 2",
      "Contacts": [
        {
          "ID": 1,
          "Name": "Contact B",
        },
        ...
      ]
    }
  ]
}

需要注意的是,每个 Customer 的 Contacts 数组都可以包含 ID 为 1 的元素。这并不奇怪,因为它是另一个 Customer 的不同联系人。我知道每个客户的 ID 都是唯一的。

我的问题是当我想为联系人定义主键时,我应该如何定义我的领域模型类。我想我需要以某种方式使用客户的 ID(如外键),但我不知道如何。到目前为止,这是我的模型。

import RealmSwift
import ObjectMapper
import ObjectMapper_Realm

class Customers: Mappable {

    var customers = List<Customer>()

    required convenience init?(map: Map) {
        self.init()
    }

    func mapping(map: Map) {
        customers <- (map["Customers"], ListTransform<Customer>())
    }
}

@objcMembers class Customer: Object, Mappable {

    dynamic var id: Int?
    dynamic var name: String?

    required convenience init?(map: Map){
        self.init()
    }

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

    func mapping(map: Map) {
        id <- map["ID"]
        name <- map["Name"]
    }
}

@objcMembers class Contact: Object, Mappable {

    dynamic var id = 0
    dynamic var name: String?

    required convenience init?(map: Map){
        self.init()
    }

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

    func mapping(map: Map) {
        id <- map["ID"]
        name <- map["Name"]
    }
}

当我使用代码覆盖 Contact 模型的主键时,我收到一条错误消息,指出 ID 为 1 的对象已经存在。 非常感谢任何帮助。

【问题讨论】:

  • 如果 sam ID 值可以重复用于不同客户之间的联系,那么它不是一个正确的标识符,您可能根本不应该在您的数据库中使用它,并且绝对不应该作为主键。跨度>
  • 这里的底线是主键必须是唯一的。您有一个具有主键的 Contact Realm 对象,但您尝试初始化该对象的不是唯一键,因此您不能这样做(您不能有多个键为 1 的联系人)。所以,我建议让 Realm 对象用@objc dynamic var contact_id = UUID().uuidString 实例化他们自己的唯一键,这保证是唯一的并且不使用正在读入的 ID。但是从问题中不清楚这些关系如何正在使用,所以这可能不是一个选项。
  • @Jay 您添加唯一标识符的建议确实解决了问题。首先,我认为我需要从客户 ID 和联系人 ID 组成一个密钥。这也可能吗?
  • 是的,可以创建这样的复合键,只要它最终是唯一的。但是......我建议使用 UUID 创建主键,然后创建包含客户 ID 和/或联系人 ID 的属性

标签: swift list realm


【解决方案1】:

这里的底线是主键必须是唯一的。

Contact Realm 对象有一个主键,但您尝试初始化对象的不是唯一键,因此您不能这样做(您不能有多个联系人,键为 1)。

换句话说,Contact 对象使用主键 1 进行初始化,但下一个对象也使用 1 等键进行初始化。

我建议让 Realm 对象实例化他们自己的唯一键

@objc dynamic var contact_id = UUID().uuidString 

保证唯一,不使用读入的ID作为主键。

 @objcMembers class Contact: Object, Mappable {
    dynamic var contact_id = UUID().uuidString
    dynamic var name: String?

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

请注意,整个班级都由班级 def 中的@objcMembers 管理。

【讨论】:

    猜你喜欢
    • 2016-12-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-25
    • 2020-05-07
    • 2020-12-20
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多