我正在构建一个应用程序,它使用数据来保存对象,然后获取结果以将它们存储在一个数组中,该数组显示在表格视图中。我添加了一个函数,以便用户可以从表视图中删除一行,我也做了它,以便从核心数据中删除对象。它在某种程度上工作,当我在模拟器上测试它时,行被删除(它没有崩溃),我可以导航到其他视图控制器,然后返回到表视图...我删除的行似乎已从核心数据中删除。问题来自我停止模拟器然后再次重新启动它。我回到表视图,我删除的行再次出现,好像它仍然在内存中。作为一名新程序员,我不确定它是否是模拟器的问题,并且它可以在实际设备上按预期工作,或者如果我的代码不起作用。更有经验的人可以告诉我,如果它是模拟器问题,或者我做错了什么,欢呼男人和女孩!
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()
}
}
}
答案 0 :(得分:4)
确保您使用NSManagedObjectContext
保存contexts.save()
,否则您的更改将不会在应用启动之间保留。您可以在applicationDidEnterBackground
中执行保存,或者在某些情况下在应用程序逻辑中执行保存。由于保存可能是一项昂贵的操作,请事先检查hasChanges
。 Apple文档说:
在调用save:方法之前,始终验证上下文是否有未提交的更改(使用hasChanges属性)。否则,核心数据可能会执行不必要的工作。