Core Data delete mit Nullify und To-Many Relationships

  • Core Data delete mit Nullify und To-Many Relationships

    Halo zusammen,

    zu erst ein mal frohe Weihnachten :)

    Ich bin hier gerade etwas am verzweifeln. Ich habe ein Projekt mit Core Data erstellt und kann hier Events und Personen hinzufügen, was auch alles gut läuft. Nur wenn ich jetzt ein Event mit Personen löschen will, komme ich zu einem komisch verhalten. Wenn ein Event gelöscht wird, sollen die Personen in Core Data erhalten bleiben, nur die Relationships sollen gelöscht werden. Dis geht bis auf einen Relationship auch sehr gut, aber dieser macht mich gerade fertig.

    So ist mein Core Data aufgebaut

    Event

    Relationship: To-Many: Reise -- > Event Deleting Rule: Nullify

    Person

    Relationship: To-Many: Reise -- > Event Deleting Rule: Nullify

    Wenn ich jetzt ein Event lösche sieht es auch in der TableView sehr gut aus. Nur wenn ich mit dem SQLite Plugin vom FireFox mir die DB anschaue, sehe ich das der Relationship bestehen bleibt. Wie man auf dem Bild unten sehen kann. So mit würde ja meine DB unnötig groß auf dem iPhone werden.

    Ich hatte versucht diesen Relationship wie folgt per Hand zu löschen, aber leider ohne großen Erfolg.

    Quellcode

    1. ​//Relationship des gelöschten Person aus dem Event entfernen
    2. Event *eventToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
    3. //Der Person das Event als Verweise löschen
    4. NSSet* setForPersons = eventToDelete.person.copy;
    5. for (Person *personInEvenToDelete in setForPersons) {
    6. NSMutableSet* eventsInPersonFromEventToDelete = [NSMutableSet setWithSet:personInEvenToDelete.event];
    7. NSSet* setForFor = (NSSet *)personInEvenToDelete.event.copy;
    8. for (Event* eventsInPerson in setForFor) {
    9. //for (Person* persinInEvent in eventsInPerson.person) {
    10. if (eventsInPerson == eventToDelete) {
    11. [eventsInPersonFromEventToDelete removeObject:eventToDelete];
    12. }
    13. //}
    14. }
    15. personInEvenToDelete.event = eventsInPersonFromEventToDelete;
    16. }
    17. eventToDelete.person = [NSSet new];
    Alles anzeigen


    Ich hoffe das mir einer von euch sagen kann wo mein Fehler ist.

    Danke

    [Blockierte Grafik: http://bilder.bitsmaker.de/Firefox.jpg]
    Vielen Dank

    Gruß

    Bongartz
  • Bongartz schrieb:

    Der oben mit angeführter Screenshot aus der CoreData Dankenbank. Hier sieht man ja das es noch Daten in den Relationship Tabellen gibt
    Ich schrübte "nie". Der Screenshot ist sicherlich kein Abbild der Ewigkeit.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • macmoonshine schrieb:

    Amin Negm-Awad schrieb:

    Ich schrübte "nie".

    Ach, ich dachte das Präteritum von Ich schreibe wäre Ich schrob. Aber das kommt wohl vom II Futur bei Sonnenaufgang... ;) +scnr+ :D
    Du verwechselt Konjunktiv und Indikativ.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • t-no schrieb:

    Ohne das ganze Modell komplett durchschaut zu haben:
    Wo löschst du überhaupt?
    Sprich, wo wird
    deleteObject(_:)
    oder eine äquivalente Methode aufgerufen?


    Also anbei der Code mit dem ich das Objekt lösche:

    Quellcode

    1. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. if (editingStyle == UITableViewCellEditingStyleDelete) {
    4. // Delete the row from the data source
    5. [[JSMCoreDataHelper managedObjectContext] deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
    6. }
    7. }


    Diesen hatte ich dann in meiner Klasse wie folgt erweitert, aber leider ohne Erfolg.

    Quellcode

    1. - (void)tableView:(UITableView *)tableView commitEditingStyle:(UITableViewCellEditingStyle)editingStyle forRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. if (editingStyle == UITableViewCellEditingStyleDelete) {
    4. //Relationship des gelöschten Person aus dem Event entfernen
    5. Event *eventToDelete = [self.fetchedResultsController objectAtIndexPath:indexPath];
    6. //Der Person das Event als Verweise löschen
    7. NSSet* setForPersons = eventToDelete.person.copy;
    8. for (Person *personInEvenToDelete in setForPersons) {
    9. NSMutableSet* eventsInPersonFromEventToDelete = [NSMutableSet setWithSet:personInEvenToDelete.event];
    10. NSSet* setForFor = (NSSet *)personInEvenToDelete.event.copy;
    11. for (Event* eventsInPerson in setForFor) {
    12. //for (Person* persinInEvent in eventsInPerson.person) {
    13. if (eventsInPerson == eventToDelete) {
    14. [eventsInPersonFromEventToDelete removeObject:eventToDelete];
    15. }
    16. //}
    17. }
    18. personInEvenToDelete.event = eventsInPersonFromEventToDelete;
    19. }
    20. eventToDelete.person = [NSSet new];
    21. [[JSMCoreDataHelper managedObjectContext] deleteObject:[self.fetchedResultsController objectAtIndexPath:indexPath]];
    22. //Speichern der Daten
    23. [JSMCoreDataHelper saveManagedObjectContext:[JSMCoreDataHelper managedObjectContext]];
    24. // [JSMCoreDataHelper performOnFetchResultController:self.fetchedResultsController];
    25. // [self.tableView reloadData];
    26. }
    27. }
    Alles anzeigen


    Danke
    Vielen Dank

    Gruß

    Bongartz
  • Bongartz schrieb:

    Ok,

    dachte schon hin das ich etwas falsch programmiert habe.

    ich werde mal so einen Test machen und schauen ob es wirklich Auswirkungen hat oder nicht.
    Wenn es größere Auswirkungen hätte, wäret du ja nicht der erste, dem das aufgefallen wäre.

    Kümmere dich doch nicht um Probleme, die du nur scheinbar hast. Du wirst genug Probleme haben, die du sicher hast.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?
  • Bongartz schrieb:

    Dies geht bis auf einen Relationship auch sehr gut

    Dieser Umstand sollte Dich vermuten lassen, dass Deine Messmethode suboptimal ist.
    Es ist zumindest eher unwahrscheinlich, dass ein und dieselbe Aktion n mal gut geht und beim n+1-ten mal plötzlich nicht mehr läuft.

    So eine Deletion Rule ist ähnlich starr wie die Schwerkraft.
    Wirfst Du fünf mal eine Deletion Rule weg und schaust ungefähr eine hunderstel Sekunde nach dem Löschen der letzten Rule in den Speicher, kann die Relation noch nicht gelöscht sein.
    Wirfst Du fünf mal ein Glas vom Tisch und knippst ungefähr eine hunderstel Sekunde nach dem Werfen des letzten Glases ein Foto davon, kann das Glas noch nicht auf dem Boden aufgeschlagen sein. ;)
    «Applejack» "Don't you use your fancy mathematics to muddle the issue!"

    Iä-86! Iä-64! Awavauatsh fthagn!

    kmr schrieb:

    Ach, Du bist auch so ein leichtgläubiger Zeitgenosse, der alles glaubt, was irgendwelche Typen vor sich hin brabbeln. :-P