将删除的行保存到核心数据错误 - Swift 3

时间:2017-02-24 18:42:13

标签: swift xcode core-data

我发布了一篇与此类似的帖子,但我的问题已经回答了一半。我希望能够滑动删除行,但然后将该数据保存到我的xcdatamodeld文件。我在xcdatamodeld中有一个名为removeTask的属性,但就我而言。任何帮助表示赞赏

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

        // 1)
        let task = tasks.remove(at: indexPath.row)

        // 2)
        saveToCoreData(task: task)

        // 3)
        tableView.beginUpdates()
        tableView.deleteRows(at: [indexPath], with: .fade)
        tableView.endUpdates()
    }
}



func saveToCoreData(task: Task) {

    do {
        try managedObjectContext.save()
    } catch {
        fatalError("Failure to save context: \(error)")
    }
}

2 个答案:

答案 0 :(得分:3)

您必须删除核心数据堆栈中数据源数组中的对象:

// 1)
let task = tasks.remove(at: indexPath.row)
managedObjectContext.delete(task)

// 2)
saveToCoreData(task: task)

// 3)
tableView.deleteRows(at: [indexPath], with: .fade)

旁注:

    单个删除操作根本不需要
  • beginUpdates() / endUpdates()

答案 1 :(得分:0)

// Insert Into CoreData (very important)
let managedObject = NSEntityDescription.insertNewObject(forEntityName: "removedTask", into: self.managedObjectContext)

// assign values
managedObject.value = task.value

这些操作是歧义的来源。
saveToCoreData调用commit editingStyle:时,其唯一目的是将上下文中所做的更改传递给持久存储。
通过执行NSEntityDescription.insertNewObject,在上下文中创建了一个新对象,这绝对不是这里的意图。

如下修改saveToCoreData将有助于:

func saveToCoreData(task: Task) {

    do {
        try managedObjectContext.save()
    } catch {
        fatalError("Failure to save context: \(error)")
    }

    // for updating tasks array with the latest data set
    let tasksFetch = NSFetchRequest(entityName: "Task") // "Task" or whatever is the actual name of entities stored in tasks array

    do {
        tasks = try managedObjectContext.executeFetchRequest(tasksFetch) as! [Task]
    } catch {
        fatalError("Failed to fetch task: \(error)")
    }
}