简体   繁体   English

如何在 Swift 4 中删除 CoreData 的对象

[英]How do I delete an object for CoreData in Swift 4

So I've written some code to read information from CoreData.所以我写了一些代码来从 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,并将数据写入 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.但是当用户滑动以删除 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()
}

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

    }

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.似乎工作,虽然刷新 UITableView 有点慢,现在正在处理。

Did you try this?你试过这个吗? Swift 3 Core Data Delete Object Swift 3 核心数据删除对象

All you have to do is delete the object and save the changes.您所要做的就是删除对象并保存更改。

PersistenceManager.swift持久化管理器.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)

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM