我有多个没有定义主键的对象(因为我们的服务器正在处理主键,而在离线模式下你无法提供主键)所以如果我改变数据,我就不能使用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.'
这里有几个问题:
是否有可能只选择一个结果?
是否有可能通过提供不是主键的字段名来更新对象?
如何在不收到此错误的情况下删除和读取对象?
实现虚拟主键可能有意义吗?
答案 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
子句作为后备。在这种情况下,我只是从函数返回。
是否有可能通过提供不是主键的字段名来更新对象?
是。执行查询以找到有问题的对象,然后根据需要更改其属性。
如何在不收到此错误的情况下删除和读取对象?
您无法删除和重新添加对象。没有办法复活已删除的对象。没有必要这样做以获得你所追求的行为。
实现虚拟主键可能有意义吗?
没有必要得到你所追求的行为。