wake-up-neo.com

Swift 3 Core Data Delete-Objekt

Leider macht mich die neue Kerndaten-Semantik verrückt. Meine vorherige Frage enthielt einen sauberen Code, der aufgrund einer falschen automatischen Generierung von Header-Dateien nicht funktionierte. Nun fahre ich mit dem Löschen von Objekten fort. Mein Code scheint sehr einfach zu sein: 

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

Ich habe ein "hartes" Debugging mit print(object) anstelle von context.delete(object) durchgeführt und es zeigte mir das richtige Objekt . Ich muss es also einfach löschen.

P.S. es gibt keine deleteObject. Jetzt hat NSManagedContext nur noch public func delete(_ sender: AnyObject?)

44
user6485277

Das Ergebnis eines Abrufs ist ein Array von verwalteten Objekten, in Ihrem Fall [Event], damit Sie das Array auflisten und alle übereinstimmenden Objekte löschen können. Beispiel (mit try? anstatt try! um einen Absturz im Falle eines Abruffehlers zu vermeiden):

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

Wenn keine übereinstimmenden Objekte vorhanden sind, ist der Abruf erfolgreich, das resultierende Array ist jedoch leer.


Anmerkung: In Ihrem Code hat object den Typ [Event] und daher in

context.delete(object)

der Compiler ruft die auf

public func delete(_ sender: AnyObject?)

methode von NSObject anstelle des erwarteten

public func delete(_ object: NSManagedObject)

methode von NSManagedObjectContext. Aus diesem Grund wird Ihr Code kompiliert, schlägt jedoch zur Laufzeit fehl.

72
Martin R

Der Trick hier ist es, Kontext nach dem Löschen Ihrer Objekte zu speichern.

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
}

Ich hoffe das kann jemandem helfen.

36
J. Lopes

Kerndatenobjekte löschen 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
} 
18
Raj Joshi
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")
    }
}
8
Hitesh Chauhan

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

Swift 4 ohne String für Entity verwenden

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
}
2
Sonius

Ich bin mir nicht sicher, ob es trotzdem helfen wird, nur wenn eine optimierte Lösung erforderlich ist. Sie können versuchen, NSBatchDeleteRequest Opertaion auszuführen 

Damit können Sie einen Löschvorgang für mehrere Objekte gleichzeitig ausführen, ohne sie in mich zu laden

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)
        }
    }
0
nikhil nangia

Core Data Object mit Abfrage in Swift 5, 4.2 löschen

let fetchrequest = NSFetchRequest<Your_Model>(entityName: "Your_Entity_Name")
fetchrequest.predicate = NSPredicate(format: "any your_key == %d", your_value)

hoffe das hilft jemandem

0
Chanaka Caldera

Löschen Sie das Objekt aus den Stammdaten

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"

        }
0
CSE 1994