Sebastien Desemberg
Sebastien Desemberg

Reputation: 321

Empty Core Data Table

I would like to remove all data from a selected Core Data Entity. I'm using the below code but getting the following error:

Unresolved identifier managedObjectContext

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

do {
   try managedObjectContext.executeRequest(batchDeleteRequest)
} catch {
   // Error Handling
}

Upvotes: 0

Views: 183

Answers (3)

vadian
vadian

Reputation: 285059

First of all – as already mentioned in the other answers – you have to get the NSManagedObjectContext from AppDelegate

let appDelegate = UIApplication.shared.delegate as! AppDelegate
let managedObjectContext = appDelegate.persistentContainer.viewContext 

Force unwrapping is perfectly fine, the application wouldn't even launch if AppDelegate was missing.

But there is a caveat:

If you call execute on the managed object context you have to merge the changes into the context because the execute operation doesn't modify the content of the context.

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
batchDeleteRequest.resultType = .resultTypeObjectIDs

do {
    let result = try managedObjectContext.execute(batchDeleteRequest) as! NSBatchDeleteResult
    let changes = [NSDeletedObjectsKey : result.result as! [NSManagedObjectID]]
    NSManagedObjectContext.mergeChanges(fromRemoteContextSave: changes, into: [managedObjectContext])
} catch {
    print(error)
}

However you can avoid the merge step if you call execute on the persistent store coordinator

let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

do {
    let persistentStoreCoordinator = managedObjectContext.persistentStoreCoordinator!
    try persistentStoreCoordinator.execute(batchDeleteRequest, with: managedObjectContext)        
} catch {
    print(error)
}

Upvotes: 3

Kishan Bhatiya
Kishan Bhatiya

Reputation: 2368

As from your error, you have not declare context from container which is in appDelegate. You can try with following code:

    guard let appDelegate = UIApplication.shared.delegate as? AppDelegate else { return }

    //We need to create a context from this container
    let managedObjectContext = appDelegate.persistentContainer.viewContext 
    let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
    let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)

    do {
         try managedObjectContext.executeRequest(batchDeleteRequest)
    } catch {
         // Error Handling
    }

Upvotes: 0

Keshu R.
Keshu R.

Reputation: 5215

Seems like you haven't declared your managedObjectCotext and trying to access it. Try this:

let managedObjectContext = (UIApplication.shared.delegate as! AppDelegate).persistentContainer.viewContext
let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: "UserAccountTbl")
let batchDeleteRequest = NSBatchDeleteRequest(fetchRequest: fetchRequest)
do {
   try managedObjectContext.executeRequest(batchDeleteRequest)
} catch {
   // Error Handling
}

Upvotes: 1

Related Questions