2015-10-21 53 views
1

警告:我是iOS,Swift和Realm的新手。使用Realm保存和检索时没有问题,但似乎无法在不崩溃的情况下更新现有对象。试图在swift中更新领域对象时获取SIGABRT

的AppDelegate:

class Bale: Object { 
    dynamic var uid = NSUUID().UUIDString 
    dynamic var id = 0 
    dynamic var number = 0 
    dynamic var type = 0 
    dynamic var weight = 0 
    dynamic var size = "" 
    dynamic var notes = "" 
    override static func primaryKey() -> String? { 
     return "uid" 
    } 
} 

在别处:(Xcode中坚持所有的!)

let bale: Bale = getBaleByIndex(baleSelected) 
    bale.id = Int(textID.text!)! 
    bale.number = Int(textNumber.text!)! 
    bale.type = Int(textType.text!)! 
    bale.weight = Int(textWeight.text!)! 
    bale.size = textSize.text! 
    bale.notes = textNotes.text! 

    try! realm.write { 
     realm.add(bale, update: true) 
    } 

getBaleByIndex:

func getBaleByIndex(index: Int) -> Bale { 
    return bales[index] 
} 

我从getBaleByIndex返回罢了对象读取数据在其他地方,这样的功能正常工作。我在上得到了SIGABRT类AppDelegate:UIResponder,UIApplicationDelegate {。没有完整的示例显示领域文档或示例中的更新。我也尝试使用realm.create和适当的参数,但仍然是不行。它看起来很简单,所以我确信我在做一些愚蠢的事情。任何帮助都会很棒。谢谢!

+0

见http://www.raywenderlich.com/10209/my-app-crashed-now-what-part-1 – rmaddy

+0

你是如何加入第一次的对象?你在哪里得到这种捆包阵列?共享更多代码可能会有所帮助 – Shripada

回答

2

什么是你在这里咬的是,一旦你添加一个对象到领域,数据不是只存储在内存中,而是直接存储在持久存储中。您必须在写入事务中对您的对象执行所有修改,并且在写入事务提交后它们将自动生效。如果它之前一直存在,则不需要再次将其添加到Realm中。所以,你需要更改您的代码是这样的:

try! realm.write { 
    let bale: Bale = getBaleByIndex(baleSelected) 
    bale.id = Int(textID.text!)! 
    bale.number = Int(textNumber.text!)! 
    bale.type = Int(textType.text!)! 
    bale.weight = Int(textWeight.text!)! 
    bale.size = textSize.text! 
    bale.notes = textNotes.text! 

    // Not needed, but depends on the implementation of `getBaleByIndex` 
    // and whether there is the guarantee that it always returns already 
    // persisted objects. 
    //realm.add(bale, update: true) 
} 
+0

这为我做了诡计。根据Realm文档,带有update:.add的.add应添加它,如果它尚不存在,并且编辑现有(如果它已经存在)(基于对象中的主键UUID)。我可能没有按照他们推荐的方式进行,但是您的解决方案按照我的希望编辑和保存数据。 – user3068774

+0

只有在您正在处理尚未保存的新实例时才有效。因此,如果你不需要与现有属性合并,你可以通过'getBaleByIndex'来替代实例化一个新的'Bale()',而不是先检索现有的属性。 – marius