境界迅速。如何使用主键

时间:2017-04-29 10:12:32

标签: 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'.'

右链接如何存在来自其他模型的对象但不创建它们?

1 个答案:

答案 0 :(得分:0)

简单的事实是Realm不允许两个单独的Object s匹配主键。您无法实例化一个全新的对象(即使用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)。这会将您的新对象与相同的主键合并到数据库中已有的主键。
祝你好运!