首页 > 解决方案 > 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
    }

标签: swiftrealm

解决方案


默认情况下,该update属性是.error,这意味着当您尝试创建或添加具有相同主键的对象时会出错。

为了防止这种情况,只需将update属性设置为.modifed.all

realm.add(card, update: .all)


推荐阅读