领域更新删除现有数据

Realm Update Deleting existing data

对 iOS13 使用 Swift 5。

我正在尝试使用联系人选择器结果更新现有的 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)
  }
}

Realm 数据库中 Person class 的所有现有内容都消失了,除了 myContactID 和 personID。

那是因为您正在用新数据更新 Personlet person = Person() 行创建一个具有所有默认值的新实例。 (firstName: String = "" 等..)

因此,当您将 myContactIDpersonId 分配给这个新创建的 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
}