web-dev-qa-db-fra.com

Domaine - Impossible de créer un objet avec une valeur de clé primaire existante

J'ai un objet Personne avec beaucoup de chiens. L'application a une page séparée où elle montre seulement les chiens et une autre page où elle montre les chiens de la personne

Mon modèle est le suivant

class Person: Object {
    dynamic var id = 0
    let dogs= List<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"
    }
}

J'ai des personnes stockées dans Realm. La personne a une page de détail où nous allons chercher et montrer ses chiens. Si le chien existe déjà, je mets à jour les dernières informations pour ce chien et l'ajoute à la liste des chiens d'une autre personne, sinon je crée un nouveau chien, l'enregistre et l'ajoute à la liste des personnes. Cela fonctionne en coredata.

// Fetch and parse dogs
if let person = realm.objects(Person.self).filter("id =\(personID)").first {
    for (_, dict): (String, JSON) in response {
        // Create dog using the dict info,my custom init method
        if let dog = Dog(dict: dict) {
            try! realm.write {
                // save it to realm
                realm.create(Dog, value:dog, update: true)
                // append dog to person
                person.dogs.append(dog)
            }
        }
    }
    try! realm.write {
        // save person
        realm.create(Person.self, value: person, update: true)
    }
}

En essayant de mettre à jour une personne avec ses chiens, le royaume lève une exception Impossible de créer un objet avec la valeur de clé primaire existante

15
Deekshith Bellare

Nous n'avons plus besoin de la méthode de TiM.

Utilisez add(_:update:).

try realm.write {
    realm.add(objects, update: Realm.UpdatePolicy.modified)
    // OR
    realm.add(object, update: .modified)
}

Enumérations Realm.UpdatePolicy:

error (default)
modified //Overwrite only properties in the existing object which are different from the new values.
all //Overwrite all properties in the existing object with the new values, even if they have not changed

NB: Fonctionne sur Realm Swift 3.16.1

1
Lal Krishna