我有映射类(简化模型)
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'.'
右链接如何存在来自其他模型的对象但不创建它们?
答案 0 :(得分:0)
简单的事实是Realm不允许两个单独的Object
s匹配主键。您无法实例化一个全新的对象(即使用let newImage = AlbumImage()
),然后将其添加到数据库中,因为Realm会尝试将其视为完全独立的图像。
如果您创建了一个新的非托管Object
,那么当您尝试将其附加到List
时,在同一事务中,它将尝试将该对象添加到Realm。在这一点上,如果新对象具有与现有对象匹配的主键,则将发生异常。
为了避免这种情况,你可以做两件事:
realm.add(albumImage, update: true)
。这会将您的新对象与相同的主键合并到数据库中已有的主键。