【发布时间】: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 的属性