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