CoreData中的删除不会删除;重新启动后出现已删除的对象

时间:2016-09-21 17:14:43

标签: ios swift core-data swift3 ios10

我从核心数据中删除对象的代码:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if editingStyle == .delete {
        // removing from core data
        let managedContext = DataController().managedObjectContext
        managedContext.delete(books[indexPath.row] as NSManagedObject)
        books.remove(at: indexPath.row)
        do {
            try managedContext.save()
// I debug on this step : "po books" and I do see that the book was deleted from the books. even more there is no errors.
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        }
        // Delete the row from the data source (from table view)
        tableView.deleteRows(at: [indexPath], with: .fade)
    }
}

删除这本书后。它从表格视图中消失,并从书籍(核心数据实体)中删除。

然后我重新启动应用程序,删除的书籍将再次出现(因为之前从未删除过)。

我发现了这个:link

但不幸的是,由于一些提交等原因,它没有多大意义。我存储在设备本地的核心数据上。

这些代码可能有所帮助:

override func viewWillAppear(_ animated: Bool) {
    super.viewWillAppear(animated)

    let managedContext = DataController().managedObjectContext
    let fetchRequest: NSFetchRequest<Book> = Book.fetchRequest()
    do {
        let results =
            try managedContext.fetch(fetchRequest)
        books = results
    } catch let error as NSError {
        print("Could not fetch \(error), \(error.userInfo)")
    }
    booksListTableView.reloadData()
}

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell {
    let cell = tableView.dequeueReusableCell(withIdentifier: bookCellIdentifier, for: indexPath) as! ShowDataTableViewCell
    let index = (indexPath as NSIndexPath).row
    let book = books[indexPath.row]
    cell.valueLabel.text = book.value(forKey: "bookName") as! String?
    return cell
}

提前致谢!

2 个答案:

答案 0 :(得分:1)

保存托管对象上下文时,会将其保存到其父上下文。这并不一定意味着它被保存到磁盘。

要保存到磁盘,您需要保存持久存储。如果您在Xcode中创建一个新应用程序并选择“使用核心数据”,您将看到应用程序代理中的代码,它在applicationWillTerminate中执行此操作。

答案 1 :(得分:0)

根据上面的建议,我修改了AppDelegate,使其与我将添加核心数据的项目相同。 它现在运作良好。

谢谢!