RealmSwift RLM异常
RealmSwift RLMException
我正在为我的项目使用 RealmSwift
。但是,我不确定如何解决以下问题:
RMLException
: Attempting to modify object outside of a write transaction - call beginWriteTransaction
on an RLMRealm
instance first
抛出。
有人知道吗?
import RealmSwift
func createOrUpdateMachineInRealm(machine: Machine){
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// do some task
let realm = Realm()
realm.beginWrite()
realm.write{
realm.add(machine, update: true)
}
realm.commitWrite()
dispatch_async(dispatch_get_main_queue()) {
// update some UI
actionDelegate?.operationCompleted(true)
}
}
}
解决方案:我也传入机器参数,并在 realm.write()
中将它们分配给机器
func createOrUpdateMachineInRealm(machine: Machine, name: String){
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// do some task
let realm = Realm()
realm.write{
machine.name = name
realm.add(machine, update: true)
}
}
}
删除 realm.beginWrite()
和 realm.commitWrite()
。使用 realm.write { }
.
时不需要它们
我遇到了和你一样的问题和异常。虽然 Nate Mann 的回答不是问题的解决方案,但它引导我朝着正确的方向前进。
您不能修改之前从数据库中提取的 Realm 对象,因为当它(无论出于何种原因)位于不同队列时,Realm 会尝试更新它并抛出错误。
因此您要么必须在 realm.write{ }
语句中进行所有修改,要么创建一个具有相同主键的新对象,以便正确更新。这也意味着您不能使用一个函数来创建 或 更新,而是需要两个单独的函数。
您的更新函数必须如下所示:
func updateMachineInRealm(machine: Machine){
var updatedMachine = Machine()
updatedMachine.name = machine.name
updatedMachine.value = machine.value + 42
updatedMachine.primaryKey = machine.primaryKey
// "transfer" or modify all the values of the old machine object
let realm = try! Realm()
do {
try realm.write() {
realm.add(updatedMachine, update: true)
}
}
请记住,您需要一个唯一的主键才能使此代码生效,因为这是 Realm 将在数据库中将您的新对象与它匹配的内容。
此外,当处理具有多个线程访问 Realm 对象等的较大项目时,这当然有缺点。但它适用于小型项目(就像我正在处理,你似乎正在处理) .
我正在为我的项目使用 RealmSwift
。但是,我不确定如何解决以下问题:
RMLException
: Attempting to modify object outside of a write transaction - callbeginWriteTransaction
on anRLMRealm
instance first
抛出。
有人知道吗?
import RealmSwift
func createOrUpdateMachineInRealm(machine: Machine){
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// do some task
let realm = Realm()
realm.beginWrite()
realm.write{
realm.add(machine, update: true)
}
realm.commitWrite()
dispatch_async(dispatch_get_main_queue()) {
// update some UI
actionDelegate?.operationCompleted(true)
}
}
}
解决方案:我也传入机器参数,并在 realm.write()
中将它们分配给机器 func createOrUpdateMachineInRealm(machine: Machine, name: String){
let priority = DISPATCH_QUEUE_PRIORITY_DEFAULT
dispatch_async(dispatch_get_global_queue(priority, 0)) {
// do some task
let realm = Realm()
realm.write{
machine.name = name
realm.add(machine, update: true)
}
}
}
删除 realm.beginWrite()
和 realm.commitWrite()
。使用 realm.write { }
.
我遇到了和你一样的问题和异常。虽然 Nate Mann 的回答不是问题的解决方案,但它引导我朝着正确的方向前进。
您不能修改之前从数据库中提取的 Realm 对象,因为当它(无论出于何种原因)位于不同队列时,Realm 会尝试更新它并抛出错误。
因此您要么必须在 realm.write{ }
语句中进行所有修改,要么创建一个具有相同主键的新对象,以便正确更新。这也意味着您不能使用一个函数来创建 或 更新,而是需要两个单独的函数。
您的更新函数必须如下所示:
func updateMachineInRealm(machine: Machine){
var updatedMachine = Machine()
updatedMachine.name = machine.name
updatedMachine.value = machine.value + 42
updatedMachine.primaryKey = machine.primaryKey
// "transfer" or modify all the values of the old machine object
let realm = try! Realm()
do {
try realm.write() {
realm.add(updatedMachine, update: true)
}
}
请记住,您需要一个唯一的主键才能使此代码生效,因为这是 Realm 将在数据库中将您的新对象与它匹配的内容。
此外,当处理具有多个线程访问 Realm 对象等的较大项目时,这当然有缺点。但它适用于小型项目(就像我正在处理,你似乎正在处理) .