2016-06-24 10 views
29

Niestety nowa semantyka Core Data doprowadza mnie do szału. Moje poprzednie pytanie zawierało czysty kod, który nie działał z powodu nieprawidłowego automatycznego generowania plików nagłówkowych. Teraz kontynuuję pracę z usuwaniem obiektów. Mój kod wydaje się być bardzo proste: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) 
} 

zrobiłem „twarde” debug z print(object) zamiast context.delete(object) i pokazał mi odpowiedniego obiektu. Muszę więc po prostu go usunąć.

P.S. nie ma numeru deleteObject. Teraz NSManagedContext ma tylko public func delete(_ sender: AnyObject?)

+0

ile rzeczy się zmieniło w Swift 3 (przepraszam jeśli mają), FETCH zwróci tablicę obiektów, nawet jeśli jest tylko jeden, który pasuje do orzec. Musisz przejść przez wyniki (najbezpieczniejsze) lub użyć 'object [0]', aby uzyskać dostęp do pierwszego obiektu w tablicy. – pbasdf

Odpowiedz

39

wynikiem pobierania jest tablica zarządzanych obiektów, w przypadku [Event], więc można wyliczyć tablicy i usunąć wszystkie pasujące przedmioty. przykład (stosując try? zamiast try! uniknąć zderzenia w przypadku błędu zwrcania)

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

Jeżeli nie istnieje dopasowanie obiektów następnie pobrać się, lecz uzyskany tablica jest pusta.


Uwaga: W kodzie object ma typ [Event] i dlatego w

context.delete(object) 

kompilator tworzy połączenie do sposobu NSObject

public func delete(_ sender: AnyObject?) 

zamiast oczekiwano

public func delete(_ object: NSManagedObject) 

metoda z NSManagedObjectContext. Dlatego Twój kod kompiluje , ale kończy się niepowodzeniem w czasie wykonywania.

+0

Błogosławię cię! To mi pomogło! – user3739902

+5

Nie zapomnij wywołać 'try context.save()' jak wspomniano w innej odpowiedzi. –

+0

Dobre spostrzeżenia również. – ScottyBlades

13

Usuwanie danych podstawowych obiektów 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

co to jest "Osoba" –

+1

"Osoba" to rdzeń modelu danych obiektu klasa –

22

[Swift 3] Sztuką tutaj, to zapisać kontekst po usuwać swoich obiektów.

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 
} 

Mam nadzieję, że to może komuś pomóc.

+2

To na pewno mi pomogło, dziękuję! –

+2

Błąd pobierania: - 'Nie można przekonwertować wartości typu '[Jednostka]' na oczekiwany typ argumentu 'NSManagedObject'' na linii' context.delete (object) ' – amish

+0

@amish fetchRequest zwraca tablicę. Tak więc var powinien zostać nazwany obiektami. Po wykonaniu pętli for (dla obiektów w obiektach) i pętli for można usunąć każdy obiekt – Sonius

0

Swift 4 bez użycia znaków dla Podmiotu

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 
}