CoreData: error: ... (1 inserted, 0 deleted)

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • CoreData: error: ... (1 inserted, 0 deleted)

    Hi,

    hab folgendes Problem:

    ich hab einen TableView mit Einträgen. diese kann ich per rowAction-Funktion löschen und "abhaken". das funktioniert auch. für die "abhaken"-funktion hat meine entity einen boolean wert welcher entweder auf true oder false gesetzt wird und im coredata gespeichert wird, der text der cell wird dann normal oder durchgestrichen angezeigt.

    Quellcode

    1. override func tableView(tableView: UITableView, editActionsForRowAtIndexPath indexPath: NSIndexPath) -> [UITableViewRowAction]? {
    2. //DeleteAction
    3. let deleteAction = UITableViewRowAction(style: .Normal, title: "\u{2717} \n Löschen") { action, index in
    4. print("deleteAction")
    5. let context = self.fetchedResultsController.managedObjectContext
    6. context.deleteObject(self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject)
    7. // Save the context.
    8. do {
    9. try context.save()
    10. } catch {
    11. // Replace this implementation with code to handle the error appropriately.
    12. // abort() causes the application to generate a crash log and terminate. You should not use this function in a shipping application, although it may be useful during development.
    13. //print("Unresolved error \(error), \(error.userInfo)")
    14. abort()
    15. }
    16. }
    17. deleteAction.backgroundColor = UIColor.clearColor()
    18. //CompleteAction
    19. let completeAction = UITableViewRowAction(style: .Normal, title: "\u{2713} \n Gemacht" ) { action, index in
    20. print("completeAction")
    21. let object = self.fetchedResultsController.objectAtIndexPath(indexPath) as NSManagedObject
    22. let title = object.valueForKey("title")?.description
    23. let subtitle = object.valueForKey("subtitle")?.description
    24. let completed = object.valueForKey("completed")?.boolValue
    25. print(completed!)
    26. let predicate = NSPredicate(format: "title == %@ AND subtitle == %@", title!, subtitle!)
    27. let request = NSFetchRequest(entityName: "PlanMenue")
    28. request.predicate = predicate
    29. var result = [NSManagedObject]()
    30. do {
    31. result = try self.managedObjectContext!.executeFetchRequest(request) as! [NSManagedObject]
    32. } catch {
    33. }
    34. if completed! {
    35. print("completed set to false")
    36. result[0].setValue(false, forKey: "completed")
    37. // Save the context.
    38. do {
    39. try self.managedObjectContext!.save()
    40. } catch {
    41. }
    42. } else {
    43. print("completed set to true")
    44. result[0].setValue(true, forKey: "completed")
    45. // Save the context.
    46. do {
    47. try self.managedObjectContext!.save()
    48. } catch {
    49. }
    50. }
    51. self.tableView.setEditing(false, animated: true)
    52. }
    53. completeAction.backgroundColor = UIColor.clearColor()
    54. return [deleteAction, completeAction]
    55. }
    Alles anzeigen

    wenn ich jetzt aber einen Eintrag abhake bekomme ich folgenden Fehler:

    Quellcode

    1. CoreData: error: Serious application error. An exception was caught from the delegate of NSFetchedResultsController during a call to -controllerDidChangeContent:. Invalid update: invalid number of rows in section 0. The number of rows contained in an existing section after the update (5) must be equal to the number of rows contained in that section before the update (5), plus or minus the number of rows inserted or deleted from that section (1 inserted, 0 deleted) and plus or minus the number of rows moved into or out of that section (0 moved in, 0 moved out). with userInfo (null)
    und ich kann die cell nicht mehr zur Seite "swipen" und wenn ich einen ertrag hinzufüge zeigt es mir den nicht mehr an. erst wenn die app neu gesteuert wird.

    wenn ich in controllerDidChangeContent das self.tableView.endEditing() gegen self.tableView.reloadData() austausche bekomme ich zumindest keinen Fehler angezeigt, aber swipe und hinzufügen geht immer noch nicht.

    ich versteh auch nicht wieso da steht 1 inserted, 0 deleted. Ich füge doch keine neue row hinzu sondern ändere nur ein Attribut. oder nicht?


    Wie kann ich diesen Fehler beheben?


    Danke und Gruß
    Micha
  • Ich kann kein Swift aber ich hoffe du kannst es entsprechend umsetzen was ich versuhe zu erklären :)

    Wenn Du die Delete Funktion aus der TableView benutzt, dann must du wohl oder übel auch ein Element aus der TableView löschen, ansonsten bekommst du diesen Fehler. Da Du, so wie ich verstehe nur ein Flag setzt, ist nach dem Update natürlich die Anzahl gleich der Anzahl vorher.

    Ich glaube es muss einfach die Anzahl bei numberOfRows 1 weniger zurückgeben als vor dem Update.
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • ok. wie stell ich das an?

    hab es versucht mit

    - property numberOfRows erstellen
    - in viewDidLoad die numberOfObjects vom resultController übergeben
    - in func numberOfRows: inSection: return numberOfRows
    - und bei der complete RowAction numberOfRows = numberOfRows - 1

    -> gleicher Fehler
  • Habs gelöst. :D

    war einfacher als gedacht.
    hab nur meinen sortDescriptor auf den key "completed" ändern müssen.
    jetzt klappt alles wie es soll.

    Vllt kann mir es noch jemand erklären, wer mag.
    denn den Grund versteh ich nicht. ?(