从 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 语句中得到相同的错误。有什么想法吗? 其实只有NSManagedContextsave()方法会抛出错误。我不知道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 中删除实体时出错的主要内容,如果未能解决你的问题,请参考以下文章

填充 TableView 中的 JSON 数组和 CoreData

CoreData - 从 tableView 中删除行

从 coredata 中过滤值并分配给 tableview

从 CoreData 检索的 TableView 上的图像

从 CoreData 制作 TableView

如何使用 Swift 删除 coredata 中的特定记录?