领域:删除和添加对象:对象已被删除或无效

时间:2016-10-05 18:02:15

标签: realm swift3

我有多个没有定义主键的对象(因为我们的服务器正在处理主键,而在离线模式下你无法提供主键)所以如果我改变数据,我就不能使用update方法,所以我尝试了以下内容:

func updateTest() {
    let myObjects = realm.objects(MyObject.self).filter("id = 1"); // id is NOT the primary key from realm!

    var myObject: MyObject!;

    if (myObjects.count > 0) {
        myObject = myObjects[0];
    }

    if (myObject != nil) {
        try! self.realm.write() {
            self.realm.delete(self.myObject);
        }

        // modify
        self.myObject.status = "waiting";

        try! self.realm.write() {
            self.realm.add(self.myObject); // crash
        }
    }
}

但是当我想要添加对象时,我得到:

Terminating app due to uncaught exception: 'RLMException', reason: 'Object has been deleted or invalidated.'

这里有几个问题:

是否有可能只选择一个结果?

是否有可能通过提供不是主键的字段名来更新对象?

如何在不收到此错误的情况下删除和读取对象?

实现虚拟主键可能有意义吗?

1 个答案:

答案 0 :(得分:1)

你想要做的事情可以像这样完成:

func updateTest() {
    guard let myObject = realm.objects(MyObject.self).filter("id = 1").first else {
        return
     }

    try! realm.write {
        myObject.status = "waiting"
    }
}
  

是否有可能只选择一个结果?

您可以使用Swift的guard let将结果集中的第一个元素绑定到变量(如果存在),如果找不到该对象,则使用else子句作为后备。在这种情况下,我只是从函数返回。

  

是否有可能通过提供不是主键的字段名来更新对象?

是。执行查询以找到有问题的对象,然后根据需要更改其属性。

  

如何在不收到此错误的情况下删除和读取对象?

您无法删除和重新添加对象。没有办法复活已删除的对象。没有必要这样做以获得你所追求的行为。

  

实现虚拟主键可能有意义吗?

没有必要得到你所追求的行为。