从 TableView 中的 CoreData 中删除实体时出错
Posted
技术标签:
【中文标题】从 TableView 中的 CoreData 中删除实体时出错【英文标题】:Error when removing Entity from CoreData in TableView 【发布时间】:2015-12-28 17:47:55 【问题描述】:我有一个表格视图,我用 CoreData 中的实体填充。问题是当我尝试从表视图中删除实体时。 CoreData 似乎正在删除并保存更新,但有一个错误和 2 个警告被抛出。错误似乎来自这一行
tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation: UITableViewRowAnimation.Automatic)
这就是错误所说的:
由于未捕获的异常而终止应用程序 'NSInternalInconsistencyException',原因:'无效更新:无效 第 0 节中的行数。包含在第 0 节中的行数 更新后的现有节(4)必须等于 更新之前该部分中包含的行 (4),加号或减号 从该部分插入或删除的行数(0 插入, 1 已删除)并加上或减去移入或移出的行数 该部分(0 移入,0 移出)。
我看到的两个警告如下:
“try”表达式中不会调用抛出函数 'catch' 块无法访问,因为在 'do' 中没有抛出错误 块。
这是调用此代码的函数:
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath)
if editingStyle == UITableViewCellEditingStyle.Delete
//1
let personToRemove = persons![indexPath.row]
print(personToRemove)
print(indexPath.row)
//2
coreDataStack.context.deleteObject(personToRemove)
//3
do
try! coreDataStack.saveContext()
catch let error as NSError
print("Could not save: \(error)")
//4
tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation: UITableViewRowAnimation.Automatic)
当我评论一些事情以查看故障在哪里时,它似乎是最后一行。它似乎在抱怨行数,所以在删除行时我可能遗漏了一段关键代码。
谢谢!
【问题讨论】:
【参考方案1】:保存托管对象上下文的底层方法会捕获错误,因此您可以安全地删除整个 do - catch
块。
要删除一个项目,您必须将其从表视图数据源以及核心数据堆栈中删除。
我推荐使用这个顺序
func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle,forRowAtIndexPath indexPath: NSIndexPath)
if editingStyle == UITableViewCellEditingStyle.Delete
//1
let personToRemove = persons![indexPath.row]
persons.removeAtIndex(indexPath.row)
//4
tableView.deleteRowsAtIndexPaths([indexPath],withRowAnimation: UITableViewRowAnimation.Automatic)
//2
coreDataStack.context.deleteObject(personToRemove)
//3
coreDataStack.saveContext()
我建议进一步将persons
声明为非可选。
【讨论】:
成功了!谢谢。我仍然从 do / catch 语句中得到相同的错误。有什么想法吗? 其实只有NSManagedContext
的save()
方法会抛出错误。我不知道saveContext()
做了什么。这似乎是一种自定义方法。
方法如下: func saveContext () if context.hasChanges do try context.save() catch let error as NSError print("Error: (error.localizedDescription)")中止()
删除整个 do - catch
块。我更新了答案。
嗯,有道理,因为函数中有一个 do / catch...谢谢!以上是关于从 TableView 中的 CoreData 中删除实体时出错的主要内容,如果未能解决你的问题,请参考以下文章