我在Realm DB中遇到问题,
我正在尝试删除(截断表)对象,而不是再次添加它。
但在运行时出现此异常
不允许将已删除或无效的对象添加到领域
let realm = try! Realm()
let objFolder = realm.objects(FolderColor.self)
do{
try realm.write {
realm.delete(objFolder)
for obj in arrFolderColors {
realm.add(obj)
}
}
}
catch{}
答案 0 :(得分:1)
Realm对象只是指向Realm数据库中其数据的指针。调用realm.delete
时,您将从内存和磁盘中完全删除内容。 Realm对象本身仍在内存中,但是您无法调用任何属性或尝试重新添加它。
有一个object.invalidated
属性,您可以在尝试将其添加到Realm之前检查对象是否已删除,以避免意外触发该异常。
我建议您重新考虑一下逻辑,无需调用“ realm.delete”。如果它在阵列中,则可以将其从阵列中删除,但将其保留在数据库中。
答案 1 :(得分:1)
我喜欢另一个答案,但我认为这里发生的是您有一个var类。
@objc dynamic var folderColorResults = Results<FolderColor>
在某些时候,您已经用一些FolderColor对象填充了该变量
self.folderColorResults = realm.objects(FolderColor.self).filter("color == 'blue'")
因此,当您调用问题中的代码时,它将删除Realm中的所有FolderColor对象-发生这种情况时,folderColorResults结果var也将得到更新(所有对象均已删除)。
因此,没有对象可以写回到磁盘。
请记住,Realm是一个实时数据库,并且Results对象始终与实际数据保持同步;在一个位置上更改一个对象,就可以在使用该对象的任何地方更改它。
建议的解决方法是将folderColorResults强制转换为数组。
let myArray = Array(self.folderColorResults)
这会将这些对象与Realm断开连接,并且将不会更新它们。
当然,在这个假设上我可能是完全错误的,因此,如果提供更多信息,我可以进一步更新。