Обновление области Удаление существующих данных - PullRequest
0 голосов
/ 11 февраля 2020

Использование Swift 5 для iOS13.

Я пытаюсь обновить существующую запись Realm, используя результат выбора контактов. Функция удаляет все содержимое объекта, кроме нового содержимого.

Мой код

class Person: Object {
    @objc dynamic var personId = UUID().uuidString
    @objc dynamic var firstName: String = ""
    @objc dynamic var surname: String = ""
    @objc dynamic var mobileNumber: Int = 0
    @objc dynamic var password: String = ""
    @objc dynamic var myContactID: String = ""

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

extension HomeController: CNContactPickerDelegate {
  func contactPicker(_ picker: CNContactPickerViewController, didSelect contact: CNContact) {
    picker.dismiss(animated: true, completion: nil)
    let person = Person()
    let me = realm.objects(Person.self).filter("mobileNumber == %@", mobileNumber)
    person.myContactID = contact.identifier
    person.personId = me.first!.personId
    try! realm.write {
        realm.add(person, update: .modified)
    }
    self.viewWillAppear(true)
  }
}

Все существующее содержимое класса Person в базе данных Realm исчезает, за исключением myContactID и personID.

1 Ответ

2 голосов
/ 11 февраля 2020

Это потому, что вы обновляете Person новыми данными. Строка let person = Person() создает новый экземпляр со всеми значениями по умолчанию. (firstName: String = "" et c ..)

Итак, когда вы присваиваете myContactID и personId этому вновь созданному person, оно будет выглядеть так:

Person {
    personId = FAE4C224-D37E-4C77-B6F1-C60A92F188D0;
    firstName = ;
    surname = ;
    mobileNumber = ;
    password = ;
    myContactID = contactIdentifier;
}

И когда вы вызываете realm.add(person, update: .modified), он перезапишет запись, связанную с первичным ключом, с этим вновь созданным person.

Вы хотите извлечь существующий person и изменить его. Вы можете сделать что-то вроде этого:

guard let me = realm.objects(Person.self).filter("mobileNumber == %@", mobileNumber).first else { return }
try! realm.write {
    me.myContactID = contact.identifier
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...