2016-06-24 3 views
29

Leider macht mich die neue Core Data Semantik verrückt. Meine vorherige Frage hatte einen sauberen Code, der wegen falscher automatischer Generierung von Header-Dateien nicht funktionierte. Jetzt setze ich meine Arbeit mit dem Löschen von Objekten fort. Mein Code scheint sehr einfach zu sein:Swift 3 Core Data Delete Objekt

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 eine „harte“ debug mit print(object) statt context.delete(object) und es zeigte mir das richtige Objekt. Also muss ich es nur löschen.

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

+0

Es sei denn, die Dinge in Swift 3 (Entschuldigungen, wenn sie) geändert haben, die Abruf wird ein Array von Objekten, auch wenn es nur eine ist, dass Ihre Spiele Prädikat. Sie müssen entweder die Ergebnisse durchlaufen (am sichersten) oder mit 'object [0]' auf das erste Objekt im Array zugreifen. – pbasdf

Antwort

39

Das Ergebnis einer Fetch ist ein Array von verwalteten Objekten, in Ihrem Fall [Event], so dass Sie das Array aufzählen kann und alle entsprechenden Objekte löschen. Beispiel (try? anstelle von try! mit einem Absturz in dem Fall zu vermeiden eines Fehlers holen):

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

Wenn keine passenden Objekte vorhanden sind, dann gelingt die Abruf-, aber die resultierende Array ist leer.


Hinweis: in Ihrem Code hat object den Typ [Event] und deshalb in

context.delete(object) 

der Compiler erzeugt einen Aufruf an die

public func delete(_ sender: AnyObject?) 

Methode der NSObject statt der erwartet

public func delete(_ object: NSManagedObject) 

Methode von NSManagedObjectContext. Aus diesem Grund kompiliert Ihr Code , schlägt aber zur Laufzeit fehl.

+0

Segne dich! Das hat mir geholfen! – user3739902

+5

Vergessen Sie nicht, 'try context.save()' aufzurufen, wie in einer anderen Antwort erwähnt. –

+0

Gute Einsichten auch. – ScottyBlades

13

löschen Kerndatenobjekte 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 
} 
+0

Was ist "Person" drin? –

+1

"Person" ist ein Kerndatenmodell Entität Klasse –

22

[swift 3] Der Trick hier ist es speichern Kontext nach Ihrer Objekte löschen.

let fetchRequest: NSFetchRequest<Profile> = Profile.fetchRequest() 
fetchRequest.predicate = Predicate.init(format: "profileID==\(withID)") 
let object = try! context.fetch(fetchRequest) 
context.delete(object) 

do { 
    try context.save() // <- remember to put this :) 
} catch { 
    // Do something... fatalerror 
} 

Ich hoffe, dass dies jemandem helfen kann.

+2

Es hat mir sicher geholfen, danke! –

+2

Fehler erhalten: - 'Wert des Typs '[Entity]' kann nicht in den erwarteten Argumenttyp 'NSManagedObject' in der Zeile' context.delete (object) 'konvertiert werden – amish

+0

@amish Die fetchRequest gibt ein Array zurück. Also sollte die Variable Objekte genannt werden. Nachdem Sie nur eine for-Schleife (für Objekte in Objekten) und in der for-Schleife ausgeführt haben, können Sie jedes Objekt löschen – Sonius

0

Swift 4 ohne für Entity-String mit

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 
}