Базовые данные: самый быстрый способ удалить все экземпляры объекта

383

Я использую базовые данные для локального сохранения результатов от вызова веб-служб. Веб-сервис возвращает полную объектную модель, скажем, для «Автомобилей» - их может быть около 2000 (и я не могу заставить Веб-сервис возвращать что-либо меньше, чем 1 или ВСЕ автомобили).

В следующий раз, когда я открою свое приложение, я хочу обновить постоянную копию Базовых данных, снова вызвав веб-службу для всех автомобилей, однако для предотвращения дублирования мне нужно будет сначала удалить все данные в локальном кэше.

Существует ли более быстрый способ очистки ВСЕХ экземпляров определенного объекта в контексте управляемого объекта (например, всех объектов типа «CAR»), или мне нужно запросить их вызов, затем выполнить итерацию результатов, чтобы удалить каждый из них, а затем сохранить?

В идеале я мог бы просто сказать, удалить все, где сущность Бла.

Adaromas
источник
Вы могли бы использовать базу данных в памяти
Дж. Доу

Ответы:

718

iOS 9 и более поздние версии:

В iOS 9 добавлен новый класс под названием, NSBatchDeleteRequestкоторый позволяет легко удалять объекты, соответствующие предикату, без необходимости загружать их все в память. Вот как бы вы использовали это:

Swift 5

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

do {
    try myPersistentStoreCoordinator.execute(deleteRequest, with: 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
Дэйв Делонг
источник
74
Я также настроил бы выборку только для получения NSManagedObjectID, чтобы уменьшить любые издержки от загрузки в полной структуре объекта.
Маркус С. Зарра
38
Не очевидно, как получить только NSMangagedObjectID. Use [allCars setIncludePropertyValues: NO]; (и не беспокойтесь о том, как сделать NSPropertyDescription для идентификатора объекта!)
ohhorob
6
извините за вопрос новичка: вам нужно сохранить контекст после окончания цикла for? например, [myContext save];
Стив
6
Любое новое средство в Core Data, чтобы сделать это более эффективным? Это серьезная проблема для моего приложения, которое уже далеко от портируется на Core Data. Это займет несколько секунд, чтобы удалить все 4000 записей только из одной из нескольких таблиц. Это слишком долго для пользователя, чтобы ждать. Тот же запрос напрямую с sqlite кажется мгновенным.
Дэвид
4
@DaveDeLong Как NSBatchDeleteRequest может вызвать делегат NSFetchedResultsController? Я стараюсь почти все, но ничего не происходит.
Форигер
36

Сбросить сущность в 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")
        }
    }
Рой
источник
32

Немного более чистый и универсальный: добавьте этот метод:

- (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];
}
Джон - LBAB
источник
16

Для 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")
  }
}
Гаурав Шарма
источник
12

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)")
}
Ixx
источник
1
Этот ответ должен быть обновлен новой обработкой ошибок try / catch
Suragch
10

Этот вопрос аналогичен приведенному здесь, и кто-то предложил настроить правило удаления отношений, поэтому вам нужно удалить только один объект. Поэтому, если у вас есть или вы можете создать сущность, имеющую отношение ко многим автомобилям, и установить правило удаления каскадно при удалении более высокой сущности, все машины также будут удалены. Это может сэкономить некоторое время на обработку, поскольку вам не нужно выполнять шаги, связанные с загрузкой ВСЕХ автомобилей. В большом наборе данных это может быть абсолютно необходимо.

Т. Маркл
источник
1
Я только что попробовал это в моем текущем проекте с около 600 основных объектов данных. Когда я инкапсулировал их в другой объект с каскадом, удаление заняло около 9,1 секунды. Если я использовал метод, предложенный Дейвом, для удаления потребуется около 8,7 секунд. Не заметная разница для меня.
Эндрю Циммер
8

Хороший ответ уже выложен, это только рекомендация!

Хорошим способом было бы просто добавить категорию 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

... единственное, что вам нужно, это получить managedObjectContext от делегата приложения или от того, где он у вас есть;)

после этого вы можете использовать его как:

[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"];
Эрхард Динхобл
источник
1
Извините, но [AppDelegate managedObjectContext]это не обязательно "чистая архитектура" .. ;-)
Даниэль Ринсер,
Хорошо, правда. Его код выше основан на одном managedObjectContext. основной;) В многопоточном коде я обычно объединяю основной MOC делегата приложения с другими
Эрхард Динхобл,
1
@DanielRinser может бытьdeleteAllFromEntity: inManagedObjectContext:
Мохамед Элькассас
Да. Лучше было бы изменить метод deleteAllFromEntity с метода класса на метод объекта. затем вы можете вызвать deleteAllFromEntity непосредственно для экземпляра MOC.
Эрхард Динхобл
7

Обновление 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 {
            if 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)")
    }
}
Xcodian Solangi
источник
Спасибо, но почему концепция NSBatchDeleteRequest не работает? Есть идеи.
Суреш Дуришетти
@SureshDurishetti Вы импортировали CoreData в своем классе?
Xcodian Solangi
1
Да, добавил CoreDate. Но не повезло.
Суреш Дуришетти
4
Вы забыли добавить функцию сохранения вызовов в контекст, добавьте context.save (), и все
готово
Да, это требует сохранения контекста, иначе никаких изменений не произойдет
Сурендра Кумар,
5

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)")
    }
SwiftDeveloper
источник
Также Вы можете использовать эту конструкцию: let fetchRequest: NSFetchRequest <NSFetchRequestResult> = YourTable.fetchRequest ()
Даниил Чуйко
5

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)")
        }
    }
Карун Кумар
источник
2
Спасибо за публикацию вашего ответа. Это подходит для меня. Но вы не должны просто скопировать и вставить свой код здесь. Для новичка не ясно, какие у вас CoreDataStack()или DataController()уроки. Обновление будет оценено;)
Нико С.
4

Расширяя ответ Дэйва Делонга.

Версия 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)")
        }
    }
Махин Халид
источник
проголосовал. IOS 9 способ удаления записей действительно AWSM.
Шобхакар Тивари
2

Почему бы не сложить данные, которые вы получаете с существующим кэшем? В противном случае это не «обновление», это «запуск заново», и вы также можете удалить / удалить файл SQLLite и начать заново (при условии, что вы не сохраняете и другие данные).

AlBlue
источник
1
Плохое решение Если в базе данных Sqlite есть другие таблицы, мы, очевидно, потеряем все это. Это скорее взлом для конкретного решения и не может рассматриваться для более крупных случаев.
Дипак ГМ
2

Swift 4, iOS 10+
Статическая функция, которая может применяться к любому объекту для удаления всех его данных

protocol NSManagedObjectHelper {
}
extension NSManagedObject: NSManagedObjectHelper {
}
extension NSManagedObjectHelper where Self: NSManagedObject {
    static func removeAllObjectsInContext(_ managedContext: NSManagedObjectContext) {
        let request: NSFetchRequest = NSFetchRequest(entityName: String(describing: self))
        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)

Отредактировано в 20191025: инструкция «Self.fetchRequest ()» может вызвать проблему, если мы используем несколько целей в одних и тех же проектах. Так что заменено NSFetchRequest (entityName: String (описывающий: self))

jpulikkottil
источник
1

если сущность содержит много записей, то лучше всего так, потому что это экономит память

 - (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];
    }
}
Поё лихорадка.
источник
1

В 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")
        }
    }
Amul4608
источник
1

Этот код будет работать для 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()
    }
Варун Нагария
источник
1

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)
    }
MARK IOS Developer
источник
1

быстрая очистка всех объектов в БД:

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)")
      }
   }
 }
GBK
источник
0

Ответ Дейва Делонга на 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
    }
g_low
источник
0

Решение 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) }
            }
        }
    }
}
chriswillow
источник
0

Используйте NSBatchDeleteRequest для удаления нескольких записей, если минимальный iOS 9.0. Если фоновый поток, выполнить NSManagedObjectContext сохранить, иначе используйте NSFetchRequest, чтобы получить записи и удалить все записи в течение цикла и Сохранить после удаления.

Джетендра Кумар
источник
0

в 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)")
        }

Вы должны вызвать сброс после выполнения. Если нет, он не будет обновляться в представлении таблицы.

tien113
источник
0
    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)
    }
}
Мэтт Берсон
источник
0

способ ООП без каких-либо строк в качестве имен сущностей 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
    }
Джек Даниэль
источник
-1

В 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)")
    }
}
Раджеш Логанатхан
источник