领域:更新/设置关系而不更新现有子对象

时间:2015-08-02 14:05:10

标签: ios swift realm

鉴于以下数据模型,是否有办法在不更新(现有)子对象的情况下更新或设置子关系?

数据模型

class Person: Object {
    dynamic var id = 0
    dynamic var dog: Dog?

    override static func primaryKey() -> String? {
        return "id"
    }
}

class Dog: Object {
    dynamic var id = 0
    dynamic var name = ""

    override static func primaryKey() -> String? {
        return "id"
    }
}

代码

let realm = Realm()

// query existing dog
let existingDog = realm.objectForPrimaryKey(Dog.self, key: 42)
print(existingDog) // id: 42, name: Rex

// create new dog and person
let newDog = Dog(value: ["id": 42, "name": "Pluto"])
let person = Person()


realm.write {
    // this shouldn't update the existing dog
    // i.e. the name of the dog with id: 42 in the database should still be "Rex"
    person.dog = newDog
    realm.add(person, update: true)
}

我也试图通过realm.create做到这一点,但也没有成功。有什么想法吗?

1 个答案:

答案 0 :(得分:3)

Dog class中的id属性是primaryKey。主键的目的是将数据库中的条目标记为唯一。因此,如果使用相同的主键创建对象,则将覆盖具有主键的数据库中的任何现有数据。

我不明白,你究竟想要实现什么,但你的Dog Table没有理由让多个具有相同主键的对象。这不是关系数据库的工作方式。

如果你需要一只名为Pluto的Dog和一只名为Rex且具有相同id值的Dog,那么应该创建一个不唯一的新属性( - >未标记为主键)。