在 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")
}
}
有没有办法批量删除核心数据中所有实体中存储的所有数据?
我在某处读到 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")
}
}