首页 > 解决方案 > 领域更新删除现有数据

问题描述

在 iOS13 上使用 Swift 5。

我正在尝试使用联系人选择器结果更新现有领域记录。该函数删除除新内容外的所有对象内容。

我的代码

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 类的所有现有内容都消失了,除了 myContactID 和 personID。

标签: iosswiftrealm

解决方案


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

因此,当您将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
}

推荐阅读