swift - Swift Realm:添加具有相同主键的新对象时如何处理错误?
问题描述
我在我的项目中使用 RealmSwift。(我是领域的新手)当我想添加具有相同主键的新对象时,我的应用程序因以下错误而崩溃:
尝试使用现有主键值创建“卡片”类型的对象。
我如何在不崩溃的情况下处理此错误。这是我的模型代码:
class Card: Object, Decodable {
@objc dynamic var pan = ""
@objc dynamic var title = ""
override class func primaryKey() -> String? {
return CodingKeys.pan.stringValue
}
private enum CodingKeys: CodingKey {
case pan
case title
}
required convenience init(from decoder: Decoder) throws {
self.init()
let values = try decoder.container(keyedBy: CodingKeys.self)
self.pan = try values.decode(String.self, forKey: .pan)
self.title = ""
}
}
这是我的数据库管理器代码:
class DatabaseRequest {
func addCard(_ card: Card) -> Bool {
let realm = try! Realm()
do {
try realm.write {
realm.add(card)
}
return true
} catch let error as NSError {
print(error)
return false
}
}
}
我已经看到一些解决方案,例如在将其添加到数据库之前检查具有相同主键的对象是否存在。
为什么这部分代码从未执行过,它的用途是什么?
} catch let error as NSError {
print(error)
return false
}
解决方案
默认情况下,该update
属性是.error
,这意味着当您尝试创建或添加具有相同主键的对象时会出错。
为了防止这种情况,只需将update
属性设置为.modifed
或.all
realm.add(card, update: .all)
推荐阅读
- apache-httpclient-4.x - HttpClient5 - 更改/删除了很多 API
- javascript - 前端:使用反应中的一些设置变量访问数组中的项目
- express - 带有 msal 节点的 Azure AD:如何获取用户配置文件?
- python - 如何为流水线式多输出分类器绘制树?
- ajax - Laravel/Ajax DELETE:“在 null 上调用成员函数 delete()”
- powerbi - 添加一个工具提示,将给出特定持续时间的类别百分比
- ios - 从给定 MKMapView 的当前边界获取纬度/经度的大小
- windows - 如何直接从 Windows 10 资源管理器 GUI 使用选项 ( someprogram.exe -someoption ) 运行文件
- node.js - 如何在带有 node.js 的 ejs 文件中使用 sqlite3 数据库?
- android - 自 Android Studio 4.2 以来,没有可见的可调试进程