在 Swift 3 中删除核心数据实体中的所有数据

Deleting all data in a Core Data entity in Swift 3

有没有办法批量删除核心数据中所有实体中存储的所有数据?

我在某处读到 iOS 9 或 10 苹果介绍了一种批量删除的方法,但我似乎找不到任何好的信息。

最终,我只需要一个函数来遍历实体,并删除其中的所有数据。看起来应该很简单,但是documentation/tutorials因为它被证明非常难找到。

有什么想法吗?

编辑

我将以下代码添加到附加到按钮的 IBAction 中:

@IBAction func clearAllData(_ sender: AnyObject) {
    let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "PLProjects")
    let request = NSBatchDeleteRequest(fetchRequest: fetch)

    //get the data from core data
    getPLData()

    //reload the table view
    tableView.reloadData()
}

但这似乎不起作用。如果我关闭项目并重新打开它,数据仍然存在。我假设这也是 table 视图不更新的原因,因为数据实际上并没有被删除。

您正在考虑 NSBatchDeleteRequest,它是在 iOS 中添加的 9. 像这样创建一个:

let fetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Employee")
let request = NSBatchDeleteRequest(fetchRequest: fetch)

如果您只想删除与谓词匹配的实例,您也可以添加谓词。到 运行 请求:

let result = try managedObjectContext.executeRequest(request)

请注意,批量请求不会更新您当前的任何应用状态。如果您在内存中有受删除影响的托管对象,您需要立即停止使用它们。

为了充实汤姆的回复,这是我添加的完整例程:

func deleteAllRecords() {
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext

    let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "CurrentCourse")
    let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)

    do {
        try context.execute(deleteRequest)
        try context.save()
    } catch {
        print ("There was an error")
    }
}

Declare the Method for getting the Context in your CoreDataManager Class

     class func getContext() -> NSManagedObjectContext {
            guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else {
                return NSManagedObjectContext(concurrencyType: .mainQueueConcurrencyType)
            }
            if #available(iOS 10.0, *) {
                return appDelegate.persistentContainer.viewContext
            } else {
                return appDelegate.managedObjectContext
            }
        }

Call the above method from your NSManagedObject subClass:

    class func deleteAllRecords() {
            //getting context from your Core Data Manager Class
            let managedContext = CoreDataManager.getContext()
            let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "Your entity name")
            let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
            do {
                try managedContext.execute(deleteRequest)
                try managedContext.save()
            } catch {
                print ("There is an error in deleting records")
            }
    }