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