这是我的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)
}
}
}
我在视图控制器的viewDidLoad()
方法中更改了苹果的值,如您所见:
override func viewDidLoad() {
super.viewDidLoad()
achievementDate.apple = 2
achievementDate.save()
}
然后当用户点击屏幕上的暂停按钮时更新苹果的值,如下所示:
@IBAction func pausedButtonTapped(_ sender: UIButton) {
achievementDate.apple += 1
achievementDate.save()
}
Xcode 成功运行它,但是当我单击暂停按钮时,应用程序崩溃了。在控制台它说:
*** 由于未捕获的异常“RLMException”而终止应用程序,原因:“尝试在写入事务之外修改对象 - 首先在 RLMRealm 实例上调用 beginWriteTransaction。”
我对此很困惑,顺便说一句,交易一般意味着什么?非常感谢。
写事务用于将 Realm 内对象的修改分组到单个工作单元中。托管领域对象只能在写入事务中修改。写入事务的范围是您传递给调用的块Realm.write(_:)
。调用write
开始一个写事务,主体在事务处于活动状态的情况下执行,当块返回时,写事务被提交并且更改被持久化到领域文件。
您还没有分享如何achievementDate
初始化,但根据您看到的例外情况,可以安全地假设它AchievementDate
是一个托管对象的实例(也就是说,它要么是创建的,然后是添加到领域的,要么是从 Realm 加载)。作为例外说明,您只能在写入事务中修改托管对象。您可以扩展写入事务的范围以包含对托管对象的修改,也可以避免完全修改托管对象(通过向模型类添加主键,并使用其中一个Realm.create(_:value:update:)
或Realm.add(_:update:)
withupdate: true
更新现有对象给定的主键值)。
本文收集自互联网,转载请注明来源。
如有侵权,请联系[email protected] 删除。
我来说两句