Logo Questions Linux Laravel Mysql Ubuntu Git Menu
 

Swift 3 Core Data Delete Object

People also ask

How do I delete an object in Core Data?

Table views have a built-in swipe to delete mechanic that we can draw upon to let users delete commits in our app. Helpfully, managed object context has a matching delete() method that will delete any object regardless of its type or location in the object graph.

What is Nsmanagedobjectcontext?

An object space to manipulate and track changes to managed objects.


The result of a fetch is an array of managed objects, in your case [Event], so you can enumerate the array and delete all matching objects. Example (using try? instead of try! to avoid a crash in the case of a fetch error):

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

If no matching objects exist then the fetch succeeds, but the resulting array is empty.


Note: In your code, object has the type [Event] and therefore in

context.delete(object)

the compiler creates a call to the

public func delete(_ sender: AnyObject?)

method of NSObject instead of the expected

public func delete(_ object: NSManagedObject)

method of NSManagedObjectContext. That is why your code compiles but fails at runtime.


The trick here, it is save context after deleting your objects.

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
}

I hope this can help someone.


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

Delete core data objects 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
} 

Swift 4.1, 4.2 and 5.0

     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 without using string for 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
}