2016-09-21 3 views
0

Mein Code des Löschens des Objekts von Kerndaten der Neubelebung:Löschen in CoreData wird nicht gelöscht; gelöschtes Objekt erscheint nach

func tableView(_ tableView: UITableView, commit editingStyle: UITableViewCellEditingStyle, forRowAt indexPath: IndexPath) { 
    if editingStyle == .delete { 
     // removing from core data 
     let managedContext = DataController().managedObjectContext 
     managedContext.delete(books[indexPath.row] as NSManagedObject) 
     books.remove(at: indexPath.row) 
     do { 
      try managedContext.save() 
// I debug on this step : "po books" and I do see that the book was deleted from the books. even more there is no errors. 
     } catch let error as NSError { 
      print("Could not save \(error), \(error.userInfo)") 
     } 
     // Delete the row from the data source (from table view) 
     tableView.deleteRows(at: [indexPath], with: .fade) 
    } 
} 

So nach dem Buch zu löschen. Es verschwindet aus der Tabellenansicht und wird auch aus den Büchern entfernt (Core Data Entity).

Aber dann starte ich die App neu und das gelöschte Buch erscheint wieder (wie es nie zuvor gelöscht wurde).

Ich fand dies: link

Aber leider ist es nicht viel Sinn machen, weil einige Commits usw. ich auf Kerndaten bin zu speichern, die lokal auf dem Gerät ist.

Kann dieser Codes sein kann helfen:

override func viewWillAppear(_ animated: Bool) { 
    super.viewWillAppear(animated) 

    let managedContext = DataController().managedObjectContext 
    let fetchRequest: NSFetchRequest<Book> = Book.fetchRequest() 
    do { 
     let results = 
      try managedContext.fetch(fetchRequest) 
     books = results 
    } catch let error as NSError { 
     print("Could not fetch \(error), \(error.userInfo)") 
    } 
    booksListTableView.reloadData() 
} 

func tableView(_ tableView: UITableView, cellForRowAt indexPath: IndexPath) -> UITableViewCell { 
    let cell = tableView.dequeueReusableCell(withIdentifier: bookCellIdentifier, for: indexPath) as! ShowDataTableViewCell 
    let index = (indexPath as NSIndexPath).row 
    let book = books[indexPath.row] 
    cell.valueLabel.text = book.value(forKey: "bookName") as! String? 
    return cell 
} 

Vielen Dank im Voraus!

+0

Seien Sie vorsichtig mit Standardinitialisierungen wie 'DataController()'. Sie erhalten immer eine neue Instanz der Klasse mit einem anderen verwalteten Kontext. Es macht Sinn, dass Apple empfiehlt, den Core Data-Stack in AppDelegate zu behalten (oder zumindest eine Singleton-Klasse zu verwenden). – vadian

+0

Der Grund, warum ich AppDelegate nicht verwendet habe, liegt darin, dass ich Core-Daten nach dem Erstellen des Projekts hinzugefügt habe. fand das Tutorial, wo es getan wurde durch Hinzufügen neuer Klasse, die DataController ist –

Antwort

1

Wenn Sie einen verwalteten Objektkontext speichern, wird dieser im übergeordneten Kontext gespeichert. Das bedeutet nicht unbedingt, dass es auf der Festplatte gespeichert wird.

Um auf Festplatte zu speichern, müssen Sie den persistenten Speicher speichern. Wenn Sie in Xcode eine neue Anwendung erstellen und "Core-Daten verwenden" wählen, sehen Sie Code in dem App-Delegaten, der dies in applicationWillTerminate tut.

+0

das ist das Problem, dass ich Kerndaten nach dem Erstellen des Projekts hinzugefügt. manuell. nicht zum Schöpfungszeitpunkt. Vielen Dank! –

0

Gemäß den obigen Vorschlägen habe ich AppDelegate so geändert, dass es dasselbe wie im Projekt ist, wo ich Kerndaten hinzufügen würde. Und es funktioniert jetzt gut.

Danke!

Verwandte Themen