Absturz nach Löschen aller Instanzen einer Entität

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

  • Absturz nach Löschen aller Instanzen einer Entität

    Hallo zusammen,

    in meinem App habe ich eine Statistik-Tabelle eingebaut, deren Daten ich während der Laufzeit an anderer Stelle ändere. Dies macht es erforderlich, dass ich bei einem erneuten Aufruf sämtliche Daten lösche und die Tabelle neu fülle, da sich in der Zwischenzeit Änderungen ergeben könnten.

    Das funktioniert auch grundsätzlich. Allerdings habe ich eine Entität "StatSpielerHeim", die durch eine 1:n-Relationship mit der Entität "StatSpielerHeimDaten" verbunden ist.

    Ich lösche sämtliche Instanzen von "StatSpielerHeim" mit folgendem Code:

    Quellcode

    1. NSManagedObjectContext *spielerHeimContext =
    2. [self.statSpielerHeimFetchedResultsController managedObjectContext];
    3. NSEntityDescription *spielerHeimEntity =
    4. [self.statSpielerHeimFetchedResultsController.fetchRequest entity];
    5. NSFetchRequest * allStatSpielerHeim = [[NSFetchRequest alloc] init];
    6. [allStatSpielerHeim setEntity:[NSEntityDescription entityForName:@"StatSpielerHeim" inManagedObjectContext:spielerHeimContext]];
    7. [allStatSpielerHeim setIncludesPropertyValues:NO];
    8. NSError * errorSpielerHeim = nil;
    9. NSArray * statSpielerHeim0 = [spielerHeimContext executeFetchRequest:allStatSpielerHeim error:&errorSpielerHeim];
    10. [allStatSpielerHeim release];
    11. //error handling goes here
    12. for (NSManagedObject * statSpielerHeim1 in statSpielerHeim0) {
    13. [spielerHeimContext deleteObject:statSpielerHeim1];
    14. }
    Alles anzeigen



    Beim ersten Durchlauf während einer Laufzeit funktioniert alles prima. Wenn ich den TableView dann allerdings nochmals aufrufe, stürzt das Programm ab.

    Ich habe schon verschiedene Sachen ausprobiert und ich denke, das liegt am obigen Code. Wenn ich den nämlich auskommentiere, funktioniert es. Nur sind dann eben die Spielernamen nach jedem Aufruf doppelt, dreifach usw.

    Ich nehme also an, dass nicht sauber gelöscht wird. Da es bei den anderen Entitäten, die keine 1:n-relationship haben, funktioniert, nehme ich an, dass dies der Grund für den Absturz ist.

    Bei der Entität "StatSpielerHeim" habe ich übrigens Properties auf Optional, To-Many-Relationship aktiviert und die Delete Rule auf Cascade. Bei der Entität "StatSpielerHeimDaten" die Delete Rule auf Nullify.

    Braucht ihr sonst noch Informationen?

    Danke für eure Hilfe.

    Viele Grüße
    Lars


    P.S.: Gibt es andere Möglichkeit, sämtliche Instanzen einer Entität zu löschen?
  • Danke für den Hinweise, Norbi. Aber leider kein Erfolg.

    Ich habe folgende Zeilen nach dem Löschen eingefügt:

    Quellcode

    1. NSError *error;
    2. if (![context save:&error]) {
    3. NSLog(@"Fehler in TeamController, Methode commitEditingStyle:");
    4. NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
    5. NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
    6. if(detailedErrors != nil && [detailedErrors count] > 0) {
    7. for(NSError* detailedError in detailedErrors) {
    8. NSLog(@" DetailedError: %@", [detailedError userInfo]);
    9. }
    10. }
    11. else {
    12. NSLog(@" %@", [error userInfo]);
    13. }
    14. }
    Alles anzeigen



    Stürzt aber trotzdem an der gleichen Stelle ab.

    Ich hatte das Abspeichern sowieso schon in meiner Methode drin nur ganz am Ende. Daher war es nicht bei meinem geposteten Code dabei.

    Noch ne andere Idee?
  • Ich glaube, ich hatte in einer Core Data App mit einer sehr komplexen Datenstruktur auch mal dieses Problem. Soweit ich mich erinnere, waren MO nach dem Löschen auch noch da.

    Ich habe es so gelöst, dass ich dem MO eine Art deleteYourself-Methode hinzugefügt habe, in der das MO "sich selbst" löscht. Ist zwar brutal, aber funktionierte.

    Funktioniert Deine Methode eigentlich, wenn Du nur wenige oder ein MO löschst?

    No.
  • Ich habe jetzt in dem ViewController selber die Methode

    Quellcode

    1. - (void)tableView:(UITableView *)tableView
    2. commitEditingStyle:(UITableViewCellEditingStyle)editingStyle
    3. forRowAtIndexPath:(NSIndexPath *)indexPath {
    4. if (editingStyle == UITableViewCellEditingStyleDelete) {
    5. NSManagedObjectContext *context =
    6. [self.fetchedResultsController managedObjectContext];
    7. StatSpielerHeim *statSpielerHeim = [self.fetchedResultsController objectAtIndexPath:indexPath];
    8. [context deleteObject:statSpielerHeim];
    9. // Save the context.
    10. NSError *error;
    11. if (![context save:&error]) {
    12. NSLog(@"Fehler in TeamController, Methode commitEditingStyle:");
    13. NSLog(@"Failed to save to data store: %@", [error localizedDescription]);
    14. NSArray* detailedErrors = [[error userInfo] objectForKey:NSDetailedErrorsKey];
    15. if(detailedErrors != nil && [detailedErrors count] > 0) {
    16. for(NSError* detailedError in detailedErrors) {
    17. NSLog(@" DetailedError: %@", [detailedError userInfo]);
    18. }
    19. }
    20. else {
    21. NSLog(@" %@", [error userInfo]);
    22. }
    23. }
    24. }
    25. }
    Alles anzeigen



    eingebaut. Wenn ich damit manuell nur ein MO lösche, stürzt es nicht ab, wenn ich danach den ViewController wieder aufrufe. Das MO wird auch nicht mehr angezeigt; das Löschen funktioniert also.