如何从核心数据中永久删除对象?

时间:2015-01-24 22:04:48

标签: ios swift core-data

我正在构建一个应用程序,它使用数据来保存对象,然后获取结果以将它们存储在一个数组中,该数组显示在表格视图中。我添加了一个函数,以便用户可以从表视图中删除一行,我也做了它,以便从核心数据中删除对象。它在某种程度上工作,当我在模拟器上测试它时,行被删除(它没有崩溃),我可以导航到其他视图控制器,然后返回到表视图...我删除的行似乎已从核心数据中删除。问题来自我停止模拟器然后再次重新启动它。我回到表视图,我删除的行再次出现,好像它仍然在内存中。作为一名新程序员,我不确定它是否是模拟器的问题,并且它可以在实际设备上按预期工作,或者如果我的代码不起作用。更有经验的人可以告诉我,如果它是模拟器问题,或者我做错了什么,欢呼男人和女孩!

var myList: Array<AnyObject> = []

override func viewWillAppear(animated: Bool) {

    let appDel: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let context: NSManagedObjectContext = appDel.managedObjectContext!
    let freq = NSFetchRequest(entityName: "ToDoList")        

    myList = context.executeFetchRequest(freq, error: nil)!
}


//This is where I think something is going wrong
override func tableView(tableView: UITableView, commitEditingStyle editingStyle: UITableViewCellEditingStyle, forRowAtIndexPath indexPath: NSIndexPath) {

    let appDeleg: AppDelegate = UIApplication.sharedApplication().delegate as AppDelegate
    let contexts: NSManagedObjectContext = appDeleg.managedObjectContext!

    if editingStyle == UITableViewCellEditingStyle.Delete {

        if let tblview = self.tableView {

            contexts.deleteObject(myList[indexPath.row] as NSManagedObject)
            myList.removeAtIndex(indexPath.row)
            tblview.deleteRowsAtIndexPaths([indexPath], withRowAnimation: UITableViewRowAnimation.Fade)
            self.tableView.reloadData()

        }

    }

}

1 个答案:

答案 0 :(得分:4)

确保您使用NSManagedObjectContext保存contexts.save(),否则您的更改将不会在应用启动之间保留。您可以在applicationDidEnterBackground中执行保存,或者在某些情况下在应用程序逻辑中执行保存。由于保存可能是一项昂贵的操作,请事先检查hasChanges。 Apple文档说:

  

在调用save:方法之前,始终验证上下文是否有未提交的更改(使用hasChanges属性)。否则,核心数据可能会执行不必​​要的工作。