Базовые данные: самый быстрый способ удалить все экземпляры объекта
Я использую базовые данные для локального сохранения результатов от вызова веб-служб. Веб-сервис возвращает полную объектную модель, скажем, для "Автомобилей" - их может быть около 2000 (и я не могу заставить Веб-сервис возвращать что-либо меньше, чем 1 или ВСЕ автомобили).
В следующий раз, когда я открою свое приложение, я хочу обновить постоянную копию основных данных, снова вызвав веб-службу для всех автомобилей, однако для предотвращения дублирования мне нужно будет сначала удалить все данные в локальном кэше.
Существует ли более быстрый способ очистки ВСЕХ экземпляров определенного объекта в контексте управляемого объекта (например, всех объектов типа "CAR"), или мне нужно запросить их вызов, затем выполнить итерацию результатов, чтобы удалить каждый из них, а затем сохранить?
В идеале я мог бы просто сказать, удалить все, где сущность Бла.
29 ответов
iOS 9 и более поздние версии:
iOS 9 добавил новый класс под названием NSBatchDeleteRequest
это позволяет легко удалять объекты, соответствующие предикату, без необходимости загружать их все в память. Вот как бы вы использовали это:
Swift 2
let fetchRequest = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try myPersistentStoreCoordinator.executeRequest(deleteRequest, withContext: myContext)
} catch let error as NSError {
// TODO: handle the error
}
Objective-C
NSFetchRequest *request = [[NSFetchRequest alloc] initWithEntityName:@"Car"];
NSBatchDeleteRequest *delete = [[NSBatchDeleteRequest alloc] initWithFetchRequest:request];
NSError *deleteError = nil;
[myPersistentStoreCoordinator executeRequest:delete withContext:myContext error:&deleteError];
Дополнительную информацию об удалении пакетов можно найти в сеансе "Что нового в основных данных" WWDC 2015 (начиная с ~ 14: 10).
iOS 8 и более ранние версии:
Получить их все и удалить их все:
NSFetchRequest *allCars = [[NSFetchRequest alloc] init];
[allCars setEntity:[NSEntityDescription entityForName:@"Car" inManagedObjectContext:myContext]];
[allCars setIncludesPropertyValues:NO]; //only fetch the managedObjectID
NSError *error = nil;
NSArray *cars = [myContext executeFetchRequest:allCars error:&error];
[allCars release];
//error handling goes here
for (NSManagedObject *car in cars) {
[myContext deleteObject:car];
}
NSError *saveError = nil;
[myContext save:&saveError];
//more error handling here
Сбросить сущность в Swift 3:
func resetAllRecords(in entity : String) // entity = Your_Entity_Name
{
let context = ( UIApplication.shared.delegate as! AppDelegate ).persistentContainer.viewContext
let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
do
{
try context.execute(deleteRequest)
try context.save()
}
catch
{
print ("There was an error")
}
}
Немного более чистый и универсальный: добавьте этот метод:
- (void)deleteAllEntities:(NSString *)nameEntity
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] initWithEntityName:nameEntity];
[fetchRequest setIncludesPropertyValues:NO]; //only fetch the managedObjectID
NSError *error;
NSArray *fetchedObjects = [theContext executeFetchRequest:fetchRequest error:&error];
for (NSManagedObject *object in fetchedObjects)
{
[theContext deleteObject:object];
}
error = nil;
[theContext save:&error];
}
Для Swift 2.0:
class func clearCoreData(entity:String) {
let fetchRequest = NSFetchRequest()
fetchRequest.entity = NSEntityDescription.entityForName(entity, inManagedObjectContext: moc!)
fetchRequest.includesPropertyValues = false
do {
if let results = try moc!.executeFetchRequest(fetchRequest) as? [NSManagedObject] {
for result in results {
moc!.deleteObject(result)
}
try moc!.save()
}
} catch {
LOG.debug("failed to clear core data")
}
}
Обновление Swift 4, iOS 12 и Xcode 10
100% работает просто вырезать и вставить
Просто поместите эту функцию в соответствующий класс
и вызвать эту функцию self.deleteData()
в viewDidLoad()
или где-либо, или под функцией, или кнопкой, чтобы при нажатии кнопки все данные из сущности были удалены и заменили "myEntity" как вашу сущность, которую вы определили в своих основных данных.
func deleteData() {
let appDel:AppDelegate = (UIApplication.shared.delegate as! AppDelegate)
let context:NSManagedObjectContext = appDel.persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "myEntity")
fetchRequest.returnsObjectsAsFaults = false
do
{
let results = try context.fetch(fetchRequest)
for managedObject in results
{
let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
context.delete(managedObjectData)
}
} catch let error as NSError {
print("Deleted all my data in myEntity error : \(error) \(error.userInfo)")
}
}
Swift:
let fetchRequest = NSFetchRequest()
fetchRequest.entity = NSEntityDescription.entityForName(entityName, inManagedObjectContext: context)
fetchRequest.includesPropertyValues = false
var error:NSError?
if let results = context.executeFetchRequest(fetchRequest, error: &error) as? [NSManagedObject] {
for result in results {
context.deleteObject(result)
}
var error:NSError?
if context.save(&error) {
// do something after save
} else if let error = error {
println(error.userInfo)
}
} else if let error = error {
println("error: \(error)")
}
Этот вопрос аналогичен приведенному здесь, и кто-то предложил настроить правило удаления отношений, поэтому вам нужно удалить только один объект. Поэтому, если у вас есть или вы можете создать сущность, имеющую отношение ко многим автомобилям, и установить правило удаления каскадно при удалении более высокой сущности, все машины также будут удалены. Это может сэкономить некоторое время на обработку, поскольку вам не нужно выполнять шаги, связанные с загрузкой ВСЕХ автомобилей. В большом наборе данных это может быть абсолютно необходимо.
Хороший ответ уже выложен, это только рекомендация!
Хорошим способом было бы просто добавить категорию в NSManagedObject
и реализовать метод, как я сделал:
Заголовочный файл (например, NSManagedObject+Ext.h
)
@interface NSManagedObject (Logic)
+ (void) deleteAllFromEntity:(NSString*) entityName;
@end
Файл кода: (например, NSManagedObject + Ext.m)
@implementation NSManagedObject (Logic)
+ (void) deleteAllFromEntity:(NSString *)entityName {
NSManagedObjectContext *managedObjectContext = [AppDelegate managedObjectContext];
NSFetchRequest * allRecords = [[NSFetchRequest alloc] init];
[allRecords setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext]];
[allRecords setIncludesPropertyValues:NO];
NSError * error = nil;
NSArray * result = [managedObjectContext executeFetchRequest:allRecords error:&error];
for (NSManagedObject * profile in result) {
[managedObjectContext deleteObject:profile];
}
NSError *saveError = nil;
[managedObjectContext save:&saveError];
}
@end
... единственное, что вам нужно, - это получить управляемый объект ObjectContext от делегата приложения или от того, где он у вас есть;)
после этого вы можете использовать его как:
[NSManagedObject deleteAllFromEntity:@"EntityName"];
Еще одна оптимизация может заключаться в том, что вы удаляете параметр для имени сущности и вместо этого получаете имя из имени clazz. это привело бы к использованию:
[ClazzName deleteAllFromEntity];
более чистый impl (как категория для NSManagedObjectContext):
@implementation NSManagedObjectContext (Logic)
- (void) deleteAllFromEntity:(NSString *)entityName {
NSFetchRequest * allRecords = [[NSFetchRequest alloc] init];
[allRecords setEntity:[NSEntityDescription entityForName:entityName inManagedObjectContext:self]];
[allRecords setIncludesPropertyValues:NO];
NSError * error = nil;
NSArray * result = [self executeFetchRequest:allRecords error:&error];
for (NSManagedObject * profile in result) {
[self deleteObject:profile];
}
NSError *saveError = nil;
[self save:&saveError];
}
@end
Использование тогда:
[managedObjectContext deleteAllFromEntity:@"EntityName"];
iOS 10 и позже
Работает со всеми версиями. Передайте имя сущности и выполните итерацию, чтобы удалить все записи и сохранить контекст.
func deleteData(entityToFetch: String, completion: @escaping(_ returned: Bool) ->()) {
let context = NSManagedObjectContext()
context = your managedObjectContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>()
fetchRequest.entity = NSEntityDescription.entity(forEntityName: entityToFetch, in: context)
fetchRequest.includesPropertyValues = false
do {
let results = try context.fetch(fetchRequest) as! [NSManagedObject]
for result in results {
context.delete(result)
}
try context.save()
completion(true)
} catch {
completion(false)
print("fetch error -\(error.localizedDescription)")
}
}
Swift 3.X и Swift 4.X, Простой способ. Изменить только YourTable
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "YourTable")
fetchRequest.returnsObjectsAsFaults = false
do
{
let results = try context.fetch(fetchRequest)
for managedObject in results
{
let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
context.delete(managedObjectData)
}
} catch let error as NSError {
print("Detele all my data in \(entity) error : \(error) \(error.userInfo)")
}
Swift 4, iOS 10+
Статическая функция, которая может применяться к любому объекту для удаления всех его данных.
protocol NSManagedObjectHelper {
}
extension NSManagedObject: NSManagedObjectHelper {
}
extension NSManagedObjectHelper where Self: NSManagedObject {
static func removeAllObjectsInContext(_ managedContext: NSManagedObjectContext) {
let request: NSFetchRequest = Self.fetchRequest()
let deleteRequest = NSBatchDeleteRequest(fetchRequest: request)
do {
deleteRequest.resultType = .resultTypeObjectIDs//to clear objects from memory
let result = try managedContext.execute(deleteRequest) as? NSBatchDeleteResult
if let objectIDArray = result?.result as? [NSManagedObjectID] {
let changes = [NSDeletedObjectsKey : objectIDArray]
/*By calling mergeChangesFromRemoteContextSave, all of the NSManagedObjectContext instances that are referenced will be notified that the list of entities referenced with the NSManagedObjectID array have been deleted and that the objects in memory are stale. This causes the referenced NSManagedObjectContext instances to remove any objects in memory that are loaded which match the NSManagedObjectID instances in the array.*/
NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [managedContext])
}
try managedContext.save()
} catch let error {
print(error)
}
}
}
"Комната" - это сущность
Room.removeAllObjectsInContext(self.persistentContainer.viewContext)
Быстрая очистка всех объектов в БД:
func purgeAllData() {
let uniqueNames = persistentContainer.managedObjectModel.entities.compactMap({ $0.name })
uniqueNames.forEach { (name) in
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: name)
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try persistentContainer.viewContext.execute(batchDeleteRequest)
} catch {
let nserror = error as NSError
fatalError("Unresolved error \(nserror), \(nserror.userInfo)")
}
}
}
Расширяя ответ Дэйва Делонга.
Версия Swift, которая заботится о iOS 9 и предыдущих версиях. Я также рассмотрел обработку ошибок в этом:
пусть appDelegate: AppDelegate = UIApplication.sharedApplication(). делегировать как! AppDelegate
let fetchRequest = NSFetchRequest(entityName: "Car")
if #available(iOS 9.0, *) {
let delete = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try appDelegate.persistentStoreCoordinator.executeRequest(delete, withContext: appDelegate.managedObjectContext)
} catch let error as NSError {
print("Error occured while deleting: \(error)")
}
} else {
// Fallback on earlier versions
let carRequest = NSFetchRequest()
carRequest.entity = NSEntityDescription.entityForName("Cars", inManagedObjectContext: appDelegate.managedObjectContext)
carRequest.includesPropertyValues = false
do {
let cars: NSArray = try appDelegate.managedObjectContext.executeFetchRequest(carRequest)
for car in cars {
appDelegate.managedObjectContext.delete(car)
}
try appDelegate.managedObjectContext.save()
} catch let error as NSError {
print("Error occured while fetching or saving: \(error)")
}
}
Swift4+ и Xcode 10+ Используйте приведенный ниже код для удаления всех записей из объекта.
func deleteAllRecords(entity : String) {
let managedContext = CoreDataManager.sharedManager.persistentContainer.viewContext //your context
let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
do {
try managedContext.execute(deleteRequest)
try managedContext.save()
} catch {
print ("There was an error")
}
}
Как использовать
self.deleteEntityData(entity: "YOUR_ENTITY_NAME")
SwiftUI
извлекайте экземпляры из вашей сущности и зацикливайте, чтобы удалить каждый из них.
@Environment(\.managedObjectContext) var moc
@FetchRequest(sortDescriptors: []) var wizards: FetchedResults<Wizard>
var body: some View {
VStack {
List() { }
Button("Delete all") {
for wizard in wizards {
moc.delete(wizard)
}
if moc.hasChanges {
try? moc.save()
}
}
}
}
iOS 9.0 и новее:
NSBatchDeleteRequest
используется для удаления записей в основных данных. Это работает очень быстро и занимает меньше времени, чтобы удалить все записи из сущности. Это требует NSFetchRequest
в аргументе. Если вы хотите удалить все записи из объекта, вы можете использовать его, и это работает для меня.
let manageObject:NSManagedObjectContext = appDelegateObject.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: “EnityName”)
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
let persistCor:NSPersistentStoreCoordinator = appDelegateObject.persistentObject
do {
try persistCor.executeRequest(deleteRequest, withContext: manageObject)
try manageObject.save()
} catch {
print(error?.localizedDescription)
}
Почему бы не сложить данные, которые вы получаете с существующим кэшем? В противном случае это не совсем "обновление", это "запуск заново", и вы также можете удалить / удалить файл SQLLite и начать заново (при условии, что вы не сохраняете и другие данные).
Способ ООП без каких-либо строк в качестве имен сущностейSwift 3+, Xcode 10+
func batchDelete<T>(in context: NSManagedObjectContext, fetchRequest: NSFetchRequest<T>) throws {
guard let request = fetchRequest as? NSFetchRequest<NSFetchRequestResult> else {
throw ErrorService.defaultError
}
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: request)
do {
try context.execute(batchDeleteRequest)
} catch {
throw error
}
}
затем просто вызовите блок do/catch
let fetchRequest: NSFetchRequest<YourEntity> = YourEntity.fetchRequest()
do {
let data = try context.fetch(fetchRequest)
if data.count > 0 {
try self.batchDelete(in: context, fetchRequest: fetchRequest)
}
} catch {
// throw error
}
Если сущность содержит много записей, то лучше всего так, потому что это экономит память
- (void)deleteAll:(NSManagedObjectContext *)managedObjectContext entityName:(NSString *)entityName
{
NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
[managedObjectContext setUndoManager:nil];
NSEntityDescription *entity = [NSEntityDescription entityForName:entityName inManagedObjectContext:managedObjectContext];
[fetchRequest setEntity:entity];
[fetchRequest setIncludesPropertyValues:NO];
[fetchRequest setFetchLimit:100]; // you can change this number if you want
NSError *error;
NSArray *items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
while ([items count] > 0) {
@autoreleasepool {
for (NSManagedObject *item in items) {
[managedObjectContext deleteObject:item];
}
if (![managedObjectContext save:&error]) {
NSLog(@"Error deleting %@ - error:%@",self.entityName, error);
}
}
items = [managedObjectContext executeFetchRequest:fetchRequest error:&error];
}
}
В Swift 3.0
func deleteAllRecords() {
//delete all data
let context = appDelegate.persistentContainer.viewContext
let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: "YourClassName")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
do {
try context.execute(deleteRequest)
try context.save()
} catch {
print ("There was an error")
}
}
Этот код будет работать для iOS 9 и ниже
class func deleteAllRecords(in entity : String) // entity = Your_Entity_Name
{
let context = CoreDataStack.getContext() // Note:- Replace your context here with CoreDataStack.getContext()
let deleteFetch = NSFetchRequest<NSFetchRequestResult>(entityName: entity)
if #available(iOS 9, *)
{
let deleteRequest = NSBatchDeleteRequest(fetchRequest: deleteFetch)
do
{
try context.execute(deleteRequest)
try context.save()
}
catch
{
print("There was an error:\(error)")
}
}
else
{
do{
let deleteRequest = try context.fetch(deleteFetch)
for anItem in deleteRequest {
context.delete(anItem as! NSManagedObject)
}
}
catch
{
print("There was an error:\(error)")
}
}
CoreDataStack.saveContext() // Note:- Replace your savecontext here with CoreDataStack.saveContext()
}
func deleteAll(entityName: String) {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
deleteRequest.resultType = .resultTypeObjectIDs
guard let context = self.container?.viewContext
else { print("error in deleteAll")
return }
do {
let result = try context.execute(deleteRequest) as? NSBatchDeleteResult
let objectIDArray = result?.result as? [NSManagedObjectID]
let changes: [AnyHashable : Any] = [NSDeletedObjectsKey : objectIDArray as Any]
NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [context])
} catch {
print(error.localizedDescription)
}
}
Решение Swift 3 с iOS 9 'NSBatchDeleteRequest' и откат к более ранним версиям iOS, реализованным как расширение для NSManagedObjectContext. Справочник Apple https://developer.apple.com/library/content/featuredarticles/CoreData_Batch_Guide/BatchDeletes/BatchDeletes.html
extension NSManagedObjectContext {
func batchDeleteEntities<T: NSManagedObject>(ofType type: T.Type) throws {
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: String(describing: type.self))
if #available(iOS 9.0, *) {
let request = NSBatchDeleteRequest(fetchRequest: fetchRequest)
let result = try execute(request) as? NSBatchDeleteResult
if let objectIDArray = result?.result as? [NSManagedObjectID] {
let changes = [NSDeletedObjectsKey: objectIDArray]
NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [self])
}
} else {
fetchRequest.includesPropertyValues = false
let results = try fetch(fetchRequest)
if let actualResults = results as? [NSManagedObject], !actualResults.isEmpty {
actualResults.forEach { delete($0) }
}
}
}
}
NSBatchDeleteRequest Swift 5.5 и Xcode 13.2
удаляет объекты в постоянном хранилище SQLite без загрузки в память. Изменения, внесенные в постоянное хранилище, не отражаются на объектах, которые в данный момент находятся в памяти.
После выполнения пакетного удаления удалите все объекты в памяти, которые были удалены из постоянного хранилища.
ниже приведены некоторые удобные методы расширения, которые выполняют
batchDeleteRequest
extension NSManagedObject {
private static var entityName: String {
return String(describing: self)
}
static func fetchRequest<Self>(
with predicate: NSPredicate? = nil,
configureBlock: ((NSFetchRequest<Self>) -> Void)? = nil
) -> NSFetchRequest<Self> where Self: NSFetchRequestResult {
let request = NSFetchRequest<Self>(entityName: entityName)
request.predicate = predicate
configureBlock?(request)
return request
}
static func batchDelete(with fetchRequest: NSFetchRequest<NSFetchRequestResult>,
in context: NSManagedObjectContext) {
let batchDeteleRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
batchDeteleRequest.resultType = .resultTypeObjectIDs
do {
if let fetchResult = try context.execute(batchDeteleRequest) as? NSBatchDeleteResult,
let deletedManagedObjectIds = fetchResult.result as? [NSManagedObjectID], !deletedManagedObjectIds.isEmpty {
let changes = [NSDeletedObjectsKey: deletedManagedObjectIds]
NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [context])
}
} catch {
print("Error while executing batchDeleteRequest: \(error.localizedDescription)")
}
}
}
Пример : мы можем пакетно удалить Entity, вызвав статический метод batchDelete, передав fetchRequest
class Entity: NSManagedObject {
@NSManaged var name: String?
@NSManaged var value: String?
}
extension Entity {
static func executeBatchDelete(in context: NSManagedObjectContext) {
let predicate = NSPredicate(format: "\(#keyPath(Entity.value)) == %@)", "abc")
let deleteRequest: NSFetchRequest<NSFetchRequestResult> = Entity.fetchRequest(with: predicate)
Entity.batchDelete(with: deleteRequest, in: context)
}
}
Приведенные выше ответы дают хорошее представление о том, как удалить "Автомобили"
Однако я хочу, чтобы этот ответ бросил вызов самому подходу:
1- SQLite CoreData - это реляционная база данных. В этом случае, когда нет выпуска, я бы посоветовал не использовать CoreData и, возможно, использовать вместо этого файловую систему или хранить вещи в памяти.
2- В других примерах, где сущность "Car" имеет другие отношения и, следовательно, CoreData, я бы не советовал иметь 2000 автомобилей в качестве корневой сущности. Вместо этого я бы дал им родительский объект, скажем, "CarsRepository". Затем вы можете задать отношение "один ко многим" сущности "Автомобиль" и просто заменить отношение, чтобы оно указывало на новые автомобили при их загрузке. Добавление правильного правила удаления к отношениям обеспечивает целостность модели.
Ответ Дейва Делонга на Swift 2.0 для меня не удался (в iOS 9)
Но это сработало:
let fetchRequest = NSFetchRequest(entityName: "Car")
let deleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
try managedObjectContext.executeRequest(deleteRequest)
try managedObjectContext.save()
}
catch let error as NSError {
// Handle error
}
Используйте NSBatchDeleteRequest для удаления нескольких записей, если минимальный iOS 9.0. Если фоновый поток, выполнить NSManagedObjectContext сохранить, иначе используйте NSFetchRequest, чтобы получить записи и удалить все записи в течение цикла и Сохранить после удаления.
В iOS 11.3 и Swift 4.1
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: entityName)
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest )
batchDeleteRequest.resultType = .resultTypeCount
do {
let batchDeleteResult = try dataController.viewContext.execute(batchDeleteRequest) as! NSBatchDeleteResult
print("The batch delete request has deleted \(batchDeleteResult.result!) records.")
dataController.viewContext.reset() // reset managed object context (need it for working)
} catch {
let updateError = error as NSError
print("\(updateError), \(updateError.userInfo)")
}
Вы должны вызвать сброс после выполнения. Если нет, он не будет обновляться в представлении таблицы.
В Swift 2.0:
func deleteAllData(entity: String)
{
let appDelegate = UIApplication.sharedApplication().delegate as! AppDelegate
let managedContext = appDelegate.managedObjectContext
let fetchRequest = NSFetchRequest(entityName: entity)
fetchRequest.returnsObjectsAsFaults = false
do
{
let results = try managedContext.executeFetchRequest(fetchRequest)
for managedObject in results
{
let managedObjectData:NSManagedObject = managedObject as! NSManagedObject
managedContext.deleteObject(managedObjectData)
}
} catch let error as NSError {
print("Detele all data in \(entity) error : \(error) \(error.userInfo)")
}
}