web-dev-qa-db-fra.com

Suppression de toutes les données d’une entité Core Data dans Swift 3

Existe-t-il un moyen de supprimer par lots toutes les données stockées dans toutes les entités des données de base?

J'ai lu quelque part que dans iOS 9 ou 10, cela Apple a introduit un moyen de supprimer des lots, mais je n'arrive pas à trouver de bonnes informations à ce sujet.

En fin de compte, j'ai juste besoin d'une fonction qui traverse une entité et supprime toutes les données qu'elle contient. On dirait que cela devrait être assez simple, mais la documentation et les tutoriels sont extrêmement difficiles à trouver.

Des pensées?

Éditer

J'ai ajouté le code suivant dans un IBAction attaché à un bouton:

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

Cela ne semble pas fonctionner cependant. Si je ferme le projet et le rouvre, les données sont toujours là. Je suppose que c'est aussi la raison pour laquelle la vue de tableau ne se met pas à jour, car les données ne sont pas réellement supprimées.

33
John Hubler

Vous pensez à NSBatchDeleteRequest, qui a été ajouté à iOS 9. Créez-en un comme ceci:

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

Vous pouvez également ajouter un prédicat si vous souhaitez uniquement supprimer les instances qui correspondent. Pour exécuter la demande:

let result = try managedObjectContext.executeRequest(request)

Notez que les demandes par lots ne mettent à jour aucun de vos états actuels. Si vous avez des objets en mémoire affectés par la suppression, vous devez cesser de les utiliser immédiatement.

56
Tom Harrington

Pour étoffer la réponse de Tom, voici ce que j'ai ajouté pour avoir une routine complète:

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")
    }
}
42
Zonker.in.Geneva

Déclarer la méthode pour obtenir le contexte dans votre classe CoreDataManager

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

Appelez la méthode ci-dessus à partir de votre sous-classe NSManagedObject:

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