Dati principali: il modo più rapido per eliminare tutte le istanze di un'entità


383

Sto utilizzando i dati principali per mantenere localmente i risultati di una chiamata ai servizi Web. Il servizio web restituisce il modello a oggetti completo per, diciamo, "Auto" - potrebbero essere circa 2000 (e non posso fare in modo che il Servizio Web restituisca qualcosa di meno di 1 o TUTTE le auto.

La prossima volta che apro la mia applicazione, voglio aggiornare la copia persistente dei dati principali chiamando nuovamente il servizio Web per tutte le auto, tuttavia per evitare duplicati dovrei prima eliminare tutti i dati nella cache locale.

Esiste un modo più rapido per eliminare TUTTE le istanze di un'entità specifica nel contesto dell'oggetto gestito (ad es. Tutte le entità di tipo "CAR"), o devo interrogarle, quindi scorrere i risultati per eliminarle, quindi salvare?

Idealmente potrei solo dire di eliminare tutto dove entità è Blah.


È possibile utilizzare un database in memoria
J. Doe,

Risposte:


718

iOS 9 e versioni successive:

iOS 9 ha aggiunto una nuova classe chiamata NSBatchDeleteRequestche consente di eliminare facilmente gli oggetti corrispondenti a un predicato senza doverli caricare tutti in memoria. Ecco come lo useresti:

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];

Ulteriori informazioni sulle eliminazioni batch sono disponibili nella sessione "Novità nei dati principali" del WWDC 2015 (a partire da ~ 14: 10).

iOS 8 e precedenti:

Prendi tutti e cancellali tutti:

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
Configurerei anche il recupero per recuperare solo NSManagedObjectID per ridurre il sovraccarico dal caricamento nella struttura completa degli oggetti.
Marcus S. Zarra,

38
Non è ovvio come recuperare solo NSMangagedObjectID .. use [allCars setIncludesPropertyValues: NO]; (e non preoccuparti di cercare un modo per creare una descrizione NSProperty per l'ID oggetto!)
ohhorob,

6
scusa per la domanda principiante: devi salvare il contesto dopo la fine del ciclo for? ad es. [myContext save];
Steve,

6
Qualche nuova funzione in Core Data per renderlo più efficiente? Questo è un grave problema per la mia app già molto lontana dal porting verso Core Data. Impiega più secondi per eliminare tutte le 4000 voci da una delle diverse tabelle. È troppo lungo perché l'utente possa aspettare. La stessa richiesta direttamente con sqlite sembra istantanea.
David,

4
@DaveDeLong In che modo NSBatchDeleteRequest può attivare il delegato NSFetchedResultsController? Provo quasi tutto, ma non succede nulla.
Foriger,

36

Ripristina entità in 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

Un po 'più pulito e universale: aggiungi questo metodo:

- (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];
}

16

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

1
Questa risposta dovrebbe essere aggiornata con la nuova gestione degli errori try / catch
Suragch,

10

Questa è una domanda simile a quella qui e qualcuno ha suggerito di impostare una regola di eliminazione delle relazioni, quindi devi eliminare solo un oggetto. Quindi, se hai o puoi creare un'entità con una relazione a molti con le auto e impostare la regola di eliminazione in cascata quando elimini l'entità superiore, verranno eliminate anche tutte le auto. Ciò può far risparmiare tempo di elaborazione poiché non è necessario eseguire i passaggi necessari per caricare TUTTE le auto. In un set di dati più grande questo potrebbe essere assolutamente necessario.


1
Ho appena provato questo sul mio progetto attuale con circa 600 oggetti dati core. Quando li ho incapsulati in un altro oggetto con cascata ci sono voluti circa 9,1 secondi per eliminarli. Se ho usato il metodo suggerito da Dave per eliminarlo ci vogliono circa 8,7 secondi. Non è una differenza notevole per me.
Andrew Zimmer,

8

Una buona risposta è già stata pubblicata, questa è solo una raccomandazione!

Un buon modo sarebbe semplicemente aggiungere una categoria NSManagedObjecte implementare un metodo come ho fatto io:

File di intestazione (ad es. NSManagedObject+Ext.h)

@interface NSManagedObject (Logic)

+ (void) deleteAllFromEntity:(NSString*) entityName;

@end

File di codice: (ad es. 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

... l'unica cosa che devi fare è ottenere managedObjectContext dal delegato dell'app o dove tutti lo hai;)

dopo puoi usarlo come:

[NSManagedObject deleteAllFromEntity:@"EntityName"];

un'ulteriore ottimizzazione potrebbe essere quella di rimuovere il parametro per il nome entità e ottenere invece il nome dal nome clazz. questo porterebbe all'utilizzo:

[ClazzName deleteAllFromEntity];

un impl più pulito (come categoria a 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

L'utilizzo quindi:

[managedObjectContext deleteAllFromEntity:@"EntityName"];

1
Siamo spiacenti, ma [AppDelegate managedObjectContext]non è necessariamente una "architettura pulita" .. ;-)
Daniel Rinser,

Ok vero Il codice sopra riportato si basa su un managedObjectContext. quello principale;) Nel codice multithread di solito unisco il MOC principale del delegato dell'app agli altri
Erhard Dinhobl

1
@DanielRinser può esseredeleteAllFromEntity: inManagedObjectContext:
Mohamed Elkassas l'

Sì. Meglio sarebbe cambiare il metodo deleteAllFromEntity da un metodo di classe a un metodo oggetto. quindi è possibile chiamare deleteAllFromEntity direttamente su un'istanza MOC.
Erhard Dinhobl,

7

Aggiornamento Swift 4, iOS 12 e Xcode 10

100% funzionante, basta tagliare e incollare

Basta inserire questa funzione nella classe pertinente e chiamare questa funzione self.deleteData()in viewDidLoad()o ovunque o sotto una funzione o un pulsante in modo che facendo clic su un pulsante tutti i dati dall'entità debbano essere eliminati e sostituire "myEntity" come entità definita nel proprio dati di base

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

Grazie, ma perché il concetto NSBatchDeleteRequest non funziona? qualche idea.
Suresh Durishetti,

@SureshDurishetti hai importato CoreData nella tua classe?
Xcodian Solangi,

1
Sì, aggiunto CoreDate. Ma niente fortuna.
Suresh Durishetti,

4
Hai dimenticato di aggiungere la chiamata salva nel contesto, aggiungi context.save () e sei a posto
Parama Dharmika

Sì, questo richiede di salvare il contesto, altrimenti non avverrà alcun cambiamento
Surendra Kumar,

5

Swift 3.X e Swift 4.X , modo semplice. Cambia solo 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)")
    }

Inoltre puoi usare questa costruzione: let fetchRequest: NSFetchRequest <NSFetchRequestResult> = YourTable.fetchRequest ()
Daniil Chuiko

5

iOS 10 e versioni successive

Funziona con tutte le versioni. Passare il nome dell'entità e scorrere per eliminare tutte le voci e salvare il contesto.

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
Grazie per aver pubblicato la tua risposta. Per me va bene. Ma non dovresti semplicemente copiare e incollare il tuo codice qui. Per un principiante non è chiaro quali siano le tue CoreDataStack()o le tue DataController()classi. Un aggiornamento sarebbe apprezzato;)
Nico S.

4

Estensione della risposta di Dave Delong.

Versione Swift che si occupa anche di iOS 9 e versioni precedenti. Ho anche trattato la gestione degli errori in questo:

let appDelegate: AppDelegate = UIApplication.sharedApplication (). delegate as! 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)")
        }
    }

votato. iOS 9 modo di eliminare i record è davvero awsm.
Shobhakar Tiwari,

2

Perché non piegare i dati che ricevi con la cache esistente? Altrimenti non è davvero "rinfrescante", è "ricominciare" e potresti anche eliminare / eliminare il file SQLLite e ricominciare (supponendo che non stai persistendo anche altri dati).


1
Pessima soluzione. Se ci sono altre tabelle nel database Sqlite, perderemo ovviamente tutto ciò. Questo è più un trucco per una soluzione particolare e non può essere considerato per i casi più grandi.
Deepak GM

2

Swift 4, iOS 10+
Funzione statica che può essere applicata a qualsiasi entità per rimuovere tutti i suoi dati

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

La "stanza" è un'entità

Room.removeAllObjectsInContext(self.persistentContainer.viewContext)

Modificato il 20191025: l'istruzione "Self.fetchRequest ()" può causare problemi se utilizziamo più target negli stessi progetti. Così sostituito con NSFetchRequest (entityName: String (descrivendo: self))


1

se l'entità contiene molte voci, il modo migliore è così perché consente di risparmiare memoria

 - (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

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

1

Questo codice funzionerà sia per iOS 9 che per versioni precedenti

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 e versioni successive:

NSBatchDeleteRequestviene utilizzato per eliminare i record nei dati principali. Funziona molto velocemente e richiede meno tempo per eliminare tutti i record da un'entità. Richiede NSFetchRequestin discussione. Se vuoi eliminare tutti i record da un'entità, puoi usarlo e funziona per me.

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

1

eliminazione rapida di tutti gli oggetti nel DB:

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

0

La risposta Swift 2.0 di Dave Delongs è andata in crash per me (in iOS 9)

Ma ha funzionato:

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
    }

0

Soluzione Swift 3 con iOS 9 "NSBatchDeleteRequest" e fallback a versioni precedenti di iOS implementate come estensione su "NSManagedObjectContext". Riferimento 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) }
            }
        }
    }
}

0

Utilizzare NSBatchDeleteRequest per eliminare più record se iOS minimo è 9.0. Se il thread in background, eseguire NSManagedObjectContext, salvare altrimenti utilizzare NSFetchRequest per ottenere i record ed eliminare tutti i record per il ciclo e Salva al termine dell'eliminazione.


0

in iOS 11.3 e 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)")
        }

devi chiamare reset dopo aver eseguito. In caso contrario, non verrà aggiornato nella vista tabella.


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

il modo OOP senza stringhe come entità nome 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
    }
}

quindi basta chiamare il blocco 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

In 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)")
    }
}
Utilizzando il nostro sito, riconosci di aver letto e compreso le nostre Informativa sui cookie e Informativa sulla privacy.
Licensed under cc by-sa 3.0 with attribution required.