Can only delete an object from the Realm it belongs to

烈酒焚心 提交于 2019-12-10 13:04:05

问题


Im getting this error "Can only delete an object from the Realm it belongs to" every time I try to delete an object from realm on my tableview. Here is the relevant code:

let realm = try! Realm()
var checklists = [ChecklistDataModel]()

override func viewWillAppear(_ animated: Bool) {


    checklists = []
    let getChecklists = realm.objects(ChecklistDataModel.self)

    for item in getChecklists{

        let newChecklist = ChecklistDataModel()
        newChecklist.name = item.name
        newChecklist.note = item.note

        checklists.append(newChecklist)
    }

    tableView.reloadData()

}

override func numberOfSections(in tableView: UITableView) -> Int {
    return 1
}

override func tableView(_ tableView: UITableView, numberOfRowsInSection section: Int) -> Int {
    return checklists.count
}

override func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: "ChecklistCell", for: indexPath) as! ListsTableViewCell

    cell.name.text = checklists[indexPath.row].name
    return cell
}

override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {

        // Delete the row from the data source
        try! realm.write {
            realm.delete(checklists[indexPath.row])
        }

        //delete locally
        checklists.remove(at: indexPath.row)

        self.tableView.deleteRows(at: [indexPath], with: .fade)
    }
}

I know it is this part to be specific:

     // Delete the row from the data source
        try! realm.write {
            realm.delete(checklists[indexPath.row])
        }

Any ideas of what is going on? Thanks in advance!


回答1:


You are trying to delete copies of your Realm objects stored in a collection instead of your actual Realm objects stored in Realm.

try! realm.write {
    realm.delete(Realm.objects(ChecklistDataModel.self).filter("name=%@",checklists[indexPath.row].name))
}

Without the definition of CheklistDataModel, I am not sure if I got the NSPredicate right, but you should be able to figure it out from here.




回答2:


From the code snippets you shared, you appear to be creating new ChecklistDataModel objects but never adding them to any Realm. Then you attempt to delete these objects from your Realm in your try! realm.write block.

Simply instantiating an object does not mean it has been added to a Realm; until it is added to a Realm through a successful write transaction it behaves just like any other Swift instance. Only after you've added the object to a Realm can you successfully delete it from that same Realm.



来源:https://stackoverflow.com/questions/43860885/can-only-delete-an-object-from-the-realm-it-belongs-to

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!