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!
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
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 –