ios - 领域更新删除现有数据
问题描述
在 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。
解决方案
那是因为您正在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
}
推荐阅读
- javascript - 从服务器 PHP 数组中提取 JSON 数据的问题
- c# - 如何将一个列表分成两个可以容纳奇数个计数的列表?
- java - Neo4j 嵌入式图 java 可视化
- python - Python:- 如何从 Excel 创建 Csv(针对特定列)
- c++ - 如何在 C++ 中实现切片运算符 []?
- ios - Paypal IOS SDK 中的用户凭据无效
- python - Django ListView 中当前用户对象的列表
- regex - 获得 SSH 攻击者的唯一 IP 范围的前 20 名列表,最后用 .0 对它们进行排序。可能的?
- python - 使用 django-taggit 时导入错误 add_lazy_relation
- html - HTML时间的时间格式 所有浏览器都支持输入类型