2016-06-24 22 views
29

Sfortunatamente la nuova semantica Core Data mi fa impazzire. La mia domanda precedente aveva un codice pulito che non funzionava a causa della generazione automatica errata dei file di intestazione. Ora continuo il mio lavoro con l'eliminazione degli oggetti. Il mio codice sembra essere molto semplice:Swift 3 Core Data Delete Object

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

ho fatto un debug "duro" con print(object) invece di context.delete(object) e mi ha mostrato l'oggetto giusto. Quindi ho solo bisogno di cancellarlo.

P.S. non c'è deleteObject. Ora NSManagedContext ha solo public func delete(_ sender: AnyObject?)

+0

A meno che le cose sono cambiate a Swift 3 (scuse se hanno), l'operazione di recupero restituisce un array di oggetti, anche se c'è solo uno che corrisponde al tuo predicato. Per accedere al primo oggetto dell'array è necessario scorrere i risultati (più sicuro) o usare 'oggetto [0]'. – pbasdf

risposta

39

Il risultato di un'operazione di recupero è un serie di oggetti gestiti, nel tuo caso [Event], quindi è possibile enumerare la matrice ed eliminare tutti gli oggetti corrispondenti. Esempio (usando try? anziché try! per evitare una caduta nel caso di un errore di fetch):

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

Se nessun oggetto corrispondente esistono quindi il recuperano riesce, ma la risultante array è vuoto.


Nota: Nel codice, object ha il tipo [Event] e quindi in

context.delete(object) 

il compilatore crea una chiamata al metodo

public func delete(_ sender: AnyObject?) 

di NSObject al posto del atteso

public func delete(_ object: NSManagedObject) 

metodo di NSManagedObjectContext. Questo è il motivo per cui il tuo codice compila ma fallisce in fase di runtime.

+0

Benedici! Questo mi ha aiutato! – user3739902

+5

Non dimenticare di chiamare 'try context.save()' come menzionato in un'altra risposta. –

+0

Buoni approfondimenti anche. – ScottyBlades

13

dati Elimina nucleo oggetti rapida 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

cos'è "Person" –

+1

"Person" è una classe di entità del modello di dati nucleo –

22

[celere 3] Il trucco, è salvare contesto dopo cancellare i tuoi oggetti.

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 
} 

Spero che questo possa aiutare qualcuno.

+2

Mi ha sicuramente aiutato, grazie! –

+2

Errore di ricezione: - 'Impossibile convertire il valore di tipo '[Entità]' nel tipo di argomento previsto 'NSManagedObject'' sulla riga' context.delete (oggetto) ' – amish

+0

@amish il fetchRequest restituisce una matrice. Quindi la var dovrebbe essere chiamata oggetti. Dopo aver fatto un ciclo for (per gli oggetti negli oggetti) e nel ciclo for, puoi cancellare ogni oggetto – Sonius

0

Swift 4 senza usare stringa per Entity

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 
}