如何删除Realm中的对象?

时间:2016-09-20 01:48:07

标签: ios realm

Realm中的删除似乎难以置信......或者我错过了什么?如何从列表中删除对象?示例在哪里?

我有一个带有List的对象A. 我有另一个对象B也有一个List C有一个参考备份到其父A

我想删除一个B及其所有子对象C.如果我删除了一个C,我想将它从父集合A中删除。

我很难过......并且发现Realm docs只提供两个例子令人难以置信:

try! realm.write {
  realm.delete(cheeseBook)
}
try! realm.write {
  realm.deleteAll()
}

2 个答案:

答案 0 :(得分:9)

首先,你不应该手动实现从孩子到父母的引用。 Realm实现了an inverse relationship功能,允许子对象自动查找它们所属的对象。

class C: Object {
    let parent = LinkingObjects(fromType: A.self, property: "c")
}

Realm还不支持级联删除(那里有an issue for it here)因此仅仅删除顶级对象并期望List属性中的任何对象都不够对象也被删除。必须直接捕获这些对象,然后在删除其父对象之前手动删除它们。

let childObjects = b.subObjects
try! realm.write {
    realm.delete(childObjects)
    realm.delete(b)
}

(那应该可行,但是如果它没有,则将所有子对象复制到普通的Swift数组,然后从那里进行)

如果您完全删除Object,它也会从任何List实例中删除,因此删除C应自动删除其在A中的引用。

抱歉,您遇到了麻烦!我已经记录了一个问题,表明有关从Realm删除对象的文档已经过审核和改进。 :)

答案 1 :(得分:0)

在Swift 4中有一个Realm扩展用于级联删除。您可以在GitHub Link->(https://gist.github.com/verebes1/02950e46fff91456f2ad359b3f3ec3d9)中找到它。在您的代码中添加此扩展名后,使用它就像在delete方法上标记一个标志一样简单。

realm.delete(object, cascading: true)