RealmSwift RLMException

时间:2015-06-10 12:27:20

标签: swift realm xcode6.3

我正在为我的项目使用RealmSwift。但是,我不确定如何解决以下问题:

  

RMLException:尝试修改写入事务之外的对象 - 首先在beginWriteTransaction实例上调用RLMRealm

抛出。

任何人都有任何线索?

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)
        }
     }

 }

2 个答案:

答案 0 :(得分:9)

我遇到了和你一样的问题和异常。虽然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对象等更大的项目时,这当然有缺点。但是它适用于小项目(就像我正在进行的工作,你似乎正在努力)

答案 1 :(得分:6)

摆脱realm.beginWrite()realm.commitWrite()。使用realm.write { }时不需要它们。