web-dev-qa-db-fra.com

Objet de suppression de données de base Swift 3

Malheureusement, la nouvelle sémantique de Core Data me rend fou. Ma question précédente avait un code propre qui ne fonctionnait pas à cause d'une génération automatique incorrecte de fichiers d'en-tête. Maintenant, je continue mon travail en supprimant des objets. Mon code semble être très simple: 

func deleteProfile(withID: Int) {
    let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest()
    fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)")
    let object = try! context.fetch(fetchRequest)
    context.delete(object)
} 

J'ai fait un débogage "difficile" avec print(object) au lieu de context.delete(object) et il m'a montré le bon objet . Il me faut donc le supprimer.

P.S. il n'y a pas deleteObject. Maintenant, NSManagedContext a seulement public func delete(_ sender: AnyObject?)

44
user6485277

Le résultat d'une extraction est un tableau d'objets gérés, dans votre cas [Event], afin que vous puissiez énumérer le tableau et supprimer tous les objets correspondants . Exemple (utilisez try? au lieu de try! pour éviter un blocage dans le cas d'une erreur d'extraction): 

if let result = try? context.fetch(fetchRequest) {
    for object in result {
        context.delete(object)
    }
}

Si aucun objet correspondant n'existe, alors l'extraction réussit, mais le tableau Résultant est vide.


Remarque: Dans votre code, object a le type [Event] et donc dans 

context.delete(object)

le compilateur crée un appel à la

public func delete(_ sender: AnyObject?)

méthode de NSObject au lieu de la valeur attendue

public func delete(_ object: NSManagedObject)

méthode de NSManagedObjectContext. C'est pourquoi votre code compile Mais échoue au moment de l'exécution.

64
Martin R

L'astuce ici, c'est enregistrer le contexte après la suppression de vos objets.

let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest()
fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)")
let objects = try! context.fetch(fetchRequest)
for obj in objects {
    context.delete(obj)
}

do {
    try context.save() // <- remember to put this :)
} catch {
    // Do something... fatalerror
}

J'espère que cela peut aider quelqu'un.

36
J. Lopes

Supprimer des objets de données de base Swift 3

// MARK: Delete Data Records

func deleteRecords() -> Void {
    let moc = getContext()
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "Person")

     let result = try? moc.fetch(fetchRequest)
        let resultData = result as! [Person]

        for object in resultData {
            moc.delete(object)
        }

        do {
            try moc.save()
            print("saved!")
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        } catch {

        }

}

// MARK: Get Context

func getContext () -> NSManagedObjectContext {
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    return appDelegate.persistentContainer.viewContext
} 
18
Raj Joshi
func deleteRecords() {
    let delegate = UIApplication.shared.delegate as! AppDelegate
    let context = delegate.persistentContainer.viewContext

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

    do {
        try context.execute(deleteRequest)
        try context.save()
    } catch {
        print ("There was an error")
    }
}
8
Hitesh Chauhan

Swift 4.1 & 4.2

     let appDelegate = UIApplication.shared.delegate as! AppDelegate
     let context = appDelegate.persistentContainer.viewContext
     let requestDel = NSFetchRequest<NSFetchRequestResult>(entityName: "Users")
     requestDel.returnsObjectsAsFaults = false
  // If you want to delete data on basis of some condition then you can use NSPredicate
  //  let predicateDel = NSPredicate(format: "age > %d", argumentArray: [10])
  // requestDel.predicate = predicateDel


     do {
          let arrUsrObj = try context.fetch(requestDel)
          for usrObj in arrUsrObj as! [NSManagedObject] { // Fetching Object
              context.delete(usrObj) // Deleting Object
         }
     } catch {
          print("Failed")
     }

    // Saving the Delete operation
     do {
         try context.save()
     } catch {
         print("Failed saving")
     }
3
GSK

Swift 4 sans utiliser de chaîne pour Entity

let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest()
fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)")

do {
    let objects = try context.fetch(fetchRequest)
    for object in objects {
        context.delete(object)
    }
    try context.save()
} catch _ {
    // error handling
}
2
Sonius

Je ne suis pas sûr que cela aidera toujours dans certains cas une solution optimisée, vous pouvez essayer de faire NSBatchDeleteRequest Opertaion 

Il vous permet d'effectuer l'opération de suppression sur plusieurs objets à la fois sans les charger en moi

fileprivate func deleteRecords(){
        debugPrint("Before","Making")
//Here UserNotification class is NSManagedObject Class.
        let request =  UserNotification.fetchRequest() as NSFetchRequest<UserNotification>

        let context = helper.persistentContainer.viewContext
        do{
            let deleteRequest = NSBatchDeleteRequest(fetchRequest: request as! NSFetchRequest<NSFetchRequestResult>)

            do{
                try context.execute(deleteRequest)
                debugPrint("Batch deleted")
            }
        }catch let error as NSError {
                debugPrint("Error",error)
        }
    }
0
nikhil nangia

Supprimer un objet de données principal avec une requête dans Swift 5, 4.2

let fetchrequest = NSFetchRequest<Your_Model>(entityName: "Your_Entity_Name")
fetchrequest.predicate = NSPredicate(format: "any your_key == %d", your_value)

espérons que cela aidera à quelqu'un

0
Chanaka Caldera

Supprimer l'objet des données de base

let entity = NSEntityDescription.entity(forEntityName: "Students", in: managedContext)
        let request = NSFetchRequest<NSFetchRequestResult>()
        request.entity = entity
        if let result = try? managedContext.fetch(request) {
            for object in result {
                managedContext.delete(object as! NSManagedObject)
            }
            txtName.text = ""
            txtPhone.text = ""
            txt_Address.text = ""
            labelStatus.text = "Deleted"

        }
0
CSE 1994