无法从Core Data删除数据:删除后重建仍显示已删项
问题分析与解决方案
你的问题核心是删除操作没有作用到真正要删除的Core Data对象上:代码里你新建了一个空的NSManagedObject并删除它,而非从数据源数组passwordList中取出对应位置的Core Data实体对象,导致Core Data存储里的目标数据根本没被删除,重启后自然会重新加载出来。
修正步骤:
- 移除创建新
NSManagedObject的代码,直接从passwordList中获取要删除的条目(前提是passwordList存储的是PasswordModel类型的Core Data对象) - 调整操作顺序:先删除Core Data对象并保存上下文,再更新内存数组和表格视图(逻辑上更合理,避免保存失败后出现数据不一致)
修正后的代码:
override func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCell.EditingStyle, forRowAt indexPath: IndexPath) { guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return } let managedContext = appDelegate.persistentContainer.viewContext if editingStyle == .delete { // 1. 从数据源数组中获取要删除的Core Data实体对象 let itemToDelete = self.passwordList[indexPath.row] // 2. 从Core Data上下文删除该对象 managedContext.delete(itemToDelete) // 3. 保存上下文,将删除操作持久化到本地存储 do { try managedContext.save() // 4. 更新内存数组并刷新表格 self.passwordList.remove(at: indexPath.row) self.tableView.deleteRows(at: [indexPath], with: .automatic) } catch let saveErr { print("Failed to delete password", saveErr) } } }
额外提示:
- 确保
passwordList的元素类型是PasswordModel(Core Data生成的NSManagedObject子类),而非普通数据类型 - 如果你的数据源是通过Core Data查询获取的,建议使用
NSFetchedResultsController来自动同步表格与Core Data数据,无需手动维护数组和表格刷新,能减少出错概率
内容的提问来源于stack exchange,提问作者miracdogan
相关产品推荐
相关产品推荐

