0

So I've written some code to read information from CoreData.

func getData() {        
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    // let newSitting = NSEntityDescription.insertNewObject(forEntityName: "Sittings", into: context)


    //get data from CoreData
    let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Sittings")

    request.returnsObjectsAsFaults = false

    do {
        let results = try context.fetch(request)

        if results.count > 0 {
            for result in results as! [NSManagedObject] {
                if let sittingDate = result.value(forKey: "date") as? Date {                        
                    //add data to array
                    sittingsDatesArr.append(sittingDate)                        
                }                    
            }
        }
        else {
            print ("database is empty")
        }
    }
    catch {
        print ("error")
    }
}

And write data to CoreData,

func writeData(sitDate: Date) {
    // setup CoreData
    let appDelegate = UIApplication.shared.delegate as! AppDelegate
    let context = appDelegate.persistentContainer.viewContext
    let newSitting = NSEntityDescription.insertNewObject(forEntityName: "Sittings", into: context)

    newSitting.setValue(sitDate, forKey: "date")

    do {
        try context.save()
        print ("-----SAVED-----")
    }
    catch {
        print ("XXXXX THERE WAS AN ERROR XXXXXXX")
    }
}

and all that seem to work OK.

But I can't seem to work out how to delete an entry when the user slides to delete the row in the UITableView. So far I have this,

    func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
        if (editingStyle == UITableViewCellEditingStyle.delete) {               
            dateFormatter.dateStyle = .long
            dateFormatter.timeStyle = .long

            // remove item from array
            sittingsDatesArr.remove(at: indexPath.row)

            // remove item from core data


            //refresh
            refresh()
        }
    }

For reference, this is the refresh function,

@objc func refresh(){
    getData()
    print("refreshed") 
    viewTable.reloadData()
}
Gaurav Patel
  • 532
  • 1
  • 5
  • 19
Bigdadda06
  • 45
  • 1
  • 1
  • 8
  • // remove item from core data - you are not doing anything here? – k-thorat May 22 '18 at 23:32
  • 1
    i would use an `NSFetchedResultsController` for dealing with core data and your tableview. Will make populating your tableview from core data as well as deleting from it much better. – ACerts May 23 '18 at 00:01

4 Answers4

1

if you want to remove a single object from your coredata try this code

let request = NSFetchRequest(entityName: "Person")
request.predicate = NSPredicate(format:"markedCell = %@", "Test")
if let results = context.executeFetchRequest(request, error: nil) as? [NSManagedObject] {

    // Delete _all_ objects:
    for object in results {
        context.deleteObject(object)
    }

    // Or delete first object:
    if results.count > 0 {
        context.deleteObject(results[0])
    }

} else {
    // ... fetch failed, report error
}

if you want to remove all object from your core data try this

 func deleteData(data : String) {
         // data is entity name
         let moc = getContext()
        let fetchRequest = NSFetchRequest<NSFetchRequestResult>(entityName: data)
        if  let result = try?  moc.fetch(fetchRequest){
            for object in result {
                moc.delete(object as! NSManagedObject)
            }
        }
        do{
            try moc.save()
            print("saved")
        }catch let error as NSError {
            print("Could not save \(error), \(error.userInfo)")
        }

    }
1

So I ended up having to do this:

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) {
    if (editingStyle == UITableViewCellEditingStyle.delete) {

        dateFormatter.dateStyle = .long
        dateFormatter.timeStyle = .long

        let date = sittingsDatesArr[indexPath.row]

        let appDelegate = UIApplication.shared.delegate as! AppDelegate
        let context = appDelegate.persistentContainer.viewContext
        let request = NSFetchRequest<NSFetchRequestResult>(entityName: "Sittings")

        request.predicate = NSPredicate(format:"date = %@", date as CVarArg)

        let result = try? context.fetch(request)
        let resultData = result as! [NSManagedObject]

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

        do {
            try context.save()
            print("TABLEVIEW-EDIT: saved!")
        } catch let error as NSError  {
            print("Could not save \(error), \(error.userInfo)")
        } catch {
            // add general error handle here
        }

        //refresh
        refresh()
    }
}

seems to work, although its a bit slow to refresh the UITableView, working on that now.

Bigdadda06
  • 45
  • 1
  • 1
  • 8
0

Did you try this? Swift 3 Core Data Delete Object

All you have to do is delete the object and save the changes.

Savca Marin
  • 427
  • 4
  • 11
0

PersistenceManager.swift

import CoreData

class PersistenceManager {
    static var shared: PersistenceManager = PersistenceManager()

    var persistentContainer: NSPersistentContainer = {
        let container = NSPersistentContainer(name: "Name")
        container.loadPersistentStores(completionHandler: { (_, error) in
            if let error = error as NSError? {
                fatalError("Unresolved error \(error), \(error.userInfo)")
            }
        })
        return container
    }()

    var context: NSManagedObjectContext {
        return self.persistentContainer.viewContext
    }
    
    func fetch<T: NSManagedObject>(request: NSFetchRequest<T>) -> [T] {
       do {
           let fetchResult = try self.context.fetch(request)
           return fetchResult
       } catch {
           print(error.localizedDescription)
           return []
       }
    }

    @discardableResult
    func delete(object: NSManagedObject) -> Bool {
       self.context.delete(object)
       do {
           try self.context.save()
           return true
       } catch {
           return false
       }
    }
 }

Delete data (ViewController)

  let request = NSFetchRequest<NSManagedObject>(entityName: "Name")
  var dataArray: [NSManagedObject] = []

  //CoreData - Fetch
  recentCompany =  PersistenceManager.shared.fetch(request: request)

  //CoreData - Delete
  guard let value = self?.dataArray[indexPath.row] else { return }
  PersistenceManager.shared.delete(object: value)
kyeahen
  • 161
  • 8