ios - 关于 Realm 数据库中的事务

标签 ios swift swift3 realm

这是我的 Realm 对象:

class AchievementDate : Object {

    dynamic var date: Date = Date()
    dynamic var apple: Int = Int(0)

    func save() {
        do {
            let realm = try Realm()
            try realm.write {
                realm.add(self)
            }
        } catch let error as NSError {
            fatalError(error.localizedDescription)
        }
    }
}

我在 View Controller 的 viewDidLoad() 方法中更改了 apple 的值,如您所见:

override func viewDidLoad() {      
    super.viewDidLoad()
    achievementDate.apple = 2
    achievementDate.save()    
}

然后我会在用户点击屏幕上的暂停按钮时更新苹果的值,如下所示:

@IBAction func pausedButtonTapped(_ sender: UIButton) {
    achievementDate.apple += 1
    achievementDate.save()
}

Xcode 成功运行它,但是当我单击暂停按钮时,应用程序崩溃了。在控制台中它说:

*** Terminating app due to uncaught exception 'RLMException', reason: 'Attempting to modify object outside of a write transaction - call beginWriteTransaction on an RLMRealm instance first.'

我对此很困惑,顺便说一下,交易一般是什么意思?非常感谢。

最佳答案

写入事务用于将 Realm 中对象的修改分组到单个工作单元中。 Managed Realm 对象只能在写入事务中修改。写入事务的范围是您传递给调用 Realm.write(_:) 的 block 。 .对 write 的调用开始写事务,主体在事务事件时执行,当 block 返回时,写事务被提交并将更改持久保存到 Realm 文件。

您还没有分享 achievementDate 是如何初始化的,但是根据您看到的异常可以安全地假设它是一个 AchievementDate 实例托管对象(也就是说,它要么被创建然后添加到 Realm,要么从 Realm 加载)。如异常说明,您只能在写入事务中修改托管对象。您可以扩展写入事务的范围以包含对托管对象的修改,也可以避免完全修改托管对象(通过向模型类添加主键,并使用 Realm.create(_:value:update:)Realm.add(_:update:)update: true 使用给定的主键值更新现有对象)。

关于ios - 关于 Realm 数据库中的事务,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44362120/

相关文章:

ios - 更改 iOS 滑动操作的 bool 值

ios - Google Maps 为点击和未选择状态绘制不同的标记图像

ios - 如何在Swift 3中查找包含字典的Array的索引?

swift - 谁能告诉我为什么我的过滤数组是空的?

ios - 将 block 传递给方法

html - iOS Safari 不滚动以锚定在 iframe 中

arrays - Swift 数组中的负索引

swift - 添加左侧按钮和标题后右侧按钮不显示

ios - 如何解决: Unable to simultaneously satisfy constraints

ios - 是否可以为 MKMapView 上的用户定位 Pin 设置固定的屏幕位置?