gpt4 book ai didi

ios - 境界 swift 。如何使用主键链接到现有对象

转载 作者:行者123 更新时间:2023-11-28 06:20:35 26 4
gpt4 key购买 nike

我有映射类(简化模型)

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/

26 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com