web-dev-qa-db-ja.com

レルム-既存の主キー値でオブジェクトを作成できません

たくさんの犬を飼っている人がいます。アプリには、犬だけを表示する別のページと、人の犬を表示する別のページがあります

私のモデルは次のとおりです

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"
    }
}

Realmに人が保管されています。人は私たちが彼の犬をフェッチして表示する詳細ページを持っています。犬が既に存在する場合は、その犬の最新情報を更新して人の犬のリストに追加します。それ以外の場合は、新しい犬を作成して保存し、人のリストに追加します。これは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)
    }
}

犬で人物を更新しようとすると、レルムが例外をスローします既存の主キー値でオブジェクトを作成できません

15

TiMの方法はもう必要ありません。

add(_:update:)を使用します。

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

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

注意:レルムで機能しますSwift 3.16.1

1
Lal Krishna