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

标签 ios swift realm

我有映射类(简化模型)

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/

相关文章:

ios - UIScrollViewDelegate & scrollViewDidEndScrollingAnimation :sv

android - React Native 上的 MQTT?

ios - Swift:无法使用 NSLayoutConstraint 在 Superview 中居中 UIView

SwiftRealm 如何检查 Realm 对象是否有主键?

java - 在具有权限的 Realm 对象服务器上创建新用户 Realm 的正确方法

ios - 使用嵌套多边形数组中的实际面积查找最里面的多边形

ios - PFQueryTableViewController 中带有图像的动态单元格高度

ios - 如何快速检测正在编辑哪个 TextView

ios - NSNotification Random Like 无法识别的异常

ios - 登录 Realm Mobile Platform 后弹出 View Controller