我有映射类(简化模型)
class Album: Object, Mappable {
dynamic var id = 0
var images : List<AlbumImage>?
override static func primaryKey() -> String? {
return "id"
}
required convenience init?(map: Map) {
self.init()
}
func mapping(map: Map) {
id <- map["id"]
images <- (map["images"], ListTransform<AlbumImage>())
}
}
class AlbumImage: Object, Mappable {
dynamic var src = ""
override static func primaryKey() -> String? {
return "src"
}
required convenience init?(map: Map) {
self.init()
}
func mapping(map: Map) {
src <- map["src"]
}
}
class AnotherAlbum: Object {
dynamic var id = 0
var images = List<AlbumImage>()
override static func primaryKey() -> String? {
return "id"
}
}
映射是完美的,但需要用现有的AlbumImage创建另一个对象
let aa = AnotherAlbum()
aa.id = album.id
aa.images.append(objectsIn: album.images!)
或
let aa = AnotherAlbum()
aa.id = album.id
aa.images = album.images!
然后我删除这个创建的对象 realm.delete(aa),重新启动应用程序并从上层代码再次创建
获取错误
Terminating app due to uncaught exception 'RLMException', reason: 'Can't create object with existing primary key value 'https://example.com/1.jpg'.'
如何正确链接存在于另一个模型的对象但不创建它们?
最佳答案
简单的事实是 Realm 不允许两个单独的 Object
具有匹配的主键。您不能实例化一个全新的对象(即使用 let newImage = AlbumImage()
),然后将其添加到数据库中,因为 Realm 会尝试将其视为一个完全独立的图像。
如果您创建一个新的非托管Object
,那么当您尝试将其附加到List
时,在同一个事务中,它会尝试将该对象添加到Realm以及。正是在这一点上,如果新对象具有与现有对象匹配的主键,则会发生异常。
为避免这种情况,您可以做两件事:
- 您可以通过执行 `let image = try! 查询具有相同主键的预先存在的对象。 Realm().object(ofType: AlbumImage.self, forPrimaryKey: "https://example.com/1.jpg ").然后您可以更新此对象,而不是从头开始创建一个新对象。
- 您可以更改逻辑以使用
realm.add(albumImage, update: true)
。这会将具有相同主键的新对象与数据库中已有的对象合并。
祝你好运!
关于ios - 境界 swift 。如何使用主键链接到现有对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/43694343/