Core Data Entity auslesen

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

    • Core Data Entity auslesen

      Hallo zusammen,
      ich bin gerade dabei mir Core Data beizubringen bin auch schon "relativ" weit. Leider komme ich hier nicht weiter ich versuch mal mein Problem zu schildern.
      Ich hab zwei Entities einmal "TodoEintrag" ind diesem ist ein Attribut "todoName" und das zweite "TodoNotiz" welches ein Attribut "notiz" hat.
      Die zwei Entities sind durch eine Relationship verbunden denn es kann ja ein todoeintrag mehrere Notizen haben aber eine Notiz kann nur ein todoeintrag haben.
      Jetzt bin ich so weit das ich in einem Tableview alle Einträge vom ersten Entity habe. Durch tippen auf eine Zelle im table view komme ich auf einen anderen View und dort soll der name des todoeintrages und die Notiz angezeigt werden. Das hat mit dem ersten Entity wunderbar funktioniert

      Quellcode

      1. - (void)prepareForSegue:(UIStoryboardSegue *)segue sender:(id)sender
      2. {
      3. if ([segue.identifier isEqualToString:@"edit"]) {
      4. EditTodoEintragUIViewController* controller = segue.destinationViewController;
      5. TodoEintrag* todo = [self.FetchedResultsController objectAtIndexPath:[self.tableView indexPathForSelectedRow]];
      6. controller.TodoEintrag = todo;
      7. }
      Alles anzeigen



      Jetzt meine frage wie komme ich an die jeweilige Notiz ran welche jedem TodoEintrag bei liegt.

      Danke schonmal ;)

      Dieser Beitrag wurde bereits 2 mal editiert, zuletzt von mufu ()

    • mufu schrieb:

      Jetzt meine frage wie komme ich an die jeweilige Notiz ran welche jedem TodoEintrag bei liegt.

      So, wie das aussieht, hast Du ja eigene Klassen für Deine Entities erstellt. Die Entitiyklasse TodoEintrag wird dann ja eine Property für die Relationship zu den Notizen haben, nennen sie hier jetzt einfach mal notes (kann bei Dir anders heißen). Dem EditTodoEintragUIViewController übergibst Du ja eine TodoEintrag Instanz. Im EditTodoEintragUIViewController kannst Du daher dann einfach auf die Relationship Propertiy zugreifen:

      Quellcode

      1. NSSet *notesOfTodoEintrag = self.TodoEintrag.notes;

      Hier gibt's noch mehr Lesestoff dazu.
    • Thallius schrieb:

      Du msut einfach enen Fetch über die Notizen machen mit Predicate das notiz.todo=todo ist

      So würde man es machen, wenn Core Data eine Datenbank wäre.
      Glücklicherweise ist Core Data keine Datenbank.

      mufu schrieb:

      Jetzt meine frage wie komme ich an die jeweilige Notiz ran welche jedem TodoEintrag bei liegt.

      Was Michael schreibt. Hangel Dich im Objektbaum an den Relations runter.
      Da Dein ToDo Objekt seine ganzen Relations mit sich herum schleppt, kannst Du auch ganz bequem darauf zugreifen wie auf eine Property eines jeden anderen Objekts.
      «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
    • Habe es korrigiert

      Danke für die antworten doch leider muss ich euch noch 2 weitere Fragen stellen

      ich habe es jetzt so versucht doch leider Erfolglos

      Quellcode

      1. NSSet* set = self.todoEintrag.toTodoNotiz;
      2. NSArray* array = [set allObjects];
      3. self.notiz_textfield.text = [array objectAtIndex:0];


      und die zweite Frage is warum sich mein Tableview nicht updated wenn ich im viewWillAppear [self.tableView reloadData] stehen habe.

      Quellcode

      1. -(void)viewWillAppear:(BOOL)animated{
      2. [super viewWillAppear:YES];
      3. [self FetchedResultsController];
      4. [self.tableView reloadData];
      5. }

      Denn wenn ich meine app neu starte funktioniert alles wunderbar
    • mufu schrieb:

      ich habe es jetzt so versucht doch leider Erfolglos

      Quellcode

      1. NSSet* set = self.todoEintrag.toTodoNotiz;
      2. NSArray* array = [set allObjects];
      3. self.notiz_textfield.text = [array objectAtIndex:0];

      Überlege mal. Das Textfeld erwartet einen NSString. Ist Deine TodoNotiz Klasse ein NSString? Wohl nicht, oder? Oben schreibst Du ja, die Entity TodoNotiz hat ein Attribut notiz. Nun sollte sich die Dir die Lösung schon aufdrängen.

      mufu schrieb:

      und die zweite Frage is warum sich mein Tableview nicht updated wenn ich im viewWillAppear [self.tableView reloadData] stehen habe.

      Da kommt es jetzt drauf an, wo die Daten sich ändern. Vermutlich ist es in viewWillAppear: noch zu früh für einen reload, weil der Code, der die Daten ändert, erst nach dem Aufruf von viewWillAppear: aufgerufen wird. Setze einfach mal einen Breakpoint in viewWillAppear: und einen beim Code, der die Daten ändert. Dann siehst Du ja, welcher Code zuerst durchlaufen wird.
    • Ok wenn ich das gemacht habe

      Quellcode

      1. ​NSSet *notesOfTodoEintrag = self.TodoEintrag.notes;
      dann kann ich auf die Relationship Propertiy zugreifen. Aber wie du schon gesagt hast ich brauch ja ein string und wie komme ich durch die relationship bzw durch das NSSet einen string heraus ? Entweder ich steh gerade total auf dem Schlauch oder oder ich verstehe das wirklich nicht ;)
    • OK ich komme jetzt an meine Notiz ran mit

      Quellcode

      1. ​[self.set valueForKey:@"notiz"];
      2. NSString* notiz = [NSString stringWithFormat:@"%@",[self.set valueForKey:@"notiz"]];
      3. self.notiz_textfield.text = notiz;

      Aber in meinem texfield steht immer {(meine Notiz)}. warum sind da jetzt auf einmal die Klammern da ?
    • mufu schrieb:

      Ok wenn ich das gemacht habe

      Quellcode

      1. NSSet *notesOfTodoEintrag = self.TodoEintrag.notes;
      dann kann ich auf die Relationship Propertiy zugreifen. Aber wie du schon gesagt hast ich brauch ja ein string und wie komme ich durch die relationship bzw durch das NSSet einen string heraus ? Entweder ich steh gerade total auf dem Schlauch oder oder ich verstehe das wirklich nicht ;)

      Ja, irgendwie verstehst du dein eigenes Modell nicht. ;)
      Das NSSet, was du hier bekommst enthält Objekte welcher Klasse?
      Wie speicherst Du eine Notiz in deiner TodoNotiz Klasse?
      Wenn du weißt, wie du eine Notiz in deiner TodoNotiz Klasse speicherst, dann solltest du auch wissen, wie du die Notiz auch wieder ausliest.

      mufu schrieb:

      Aber in meinem texfield steht immer {(meine Notiz)}. warum sind da jetzt auf einmal die Klammern da ?

      Lies dir mal die Dokumentation zu valueForKey: für NSSet durch. Die Methode liefert dir auch keinen NSString.
    • Ich hätte dir ja schon längst fertigen Code hier hin schreiben können, aber ich denke du lernst mehr, wenn du selbst auf die Lösung kommst. Dein Lösungsansatz hier war schon nicht verkehrt. Es fehlt da nur noch der letzte Schritt.

      Hier noch ein heißer Tipp. Schau dir in deinem Projekt in der Datei "detailViewController.m" die Zeile 67 an. Da überträgst du ja den Inhalt des Textfeldes in die TodoNotiz Instanz. Wie müsstest du diese Codezeile umschreiben, damit der Text aus der TodoNotiz Instanz ins Textfeld wandert?
    • Aber wenn ich das in viewDidLoad schreibe

      Quellcode

      1. ​self.notiz_textfield.text = self.todoNotiz.notiz;
      aber da steht natürlich nix. Da ich ja im tableviewContoller den selektierten Eintrag in den detailview
      übergebe das wäre eben der todoEintrag und der hat nur ein NSSet welches auf meine Notiz verweist. Vielleicht hätte ich noch sagen sollen das es eine one to Many Realtionship ist.
    • mufu schrieb:

      Aber wenn ich das in viewDidLoad schreibe

      Quellcode

      1. self.notiz_textfield.text = self.todoNotiz.notiz;
      aber da steht natürlich nix. Da ich ja im tableviewContoller den selektierten Eintrag in den detailview
      übergebe das wäre eben der todoEintrag und der hat nur ein NSSet welches auf meine Notiz verweist. Vielleicht hätte ich noch sagen sollen das es eine one to Many Realtionship ist.
      Das es eine "to many" Relationship ist, hast du ja bereits im Eingangspost beschrieben. Das NSSet enthält ein oder mehrere Notizen. du hast es ja auch schon geschafft, an ein TodoNotiz Objekt aus dem NSSet zu kommen. Was hält dich jetzt noch davon ab auf die Notiz in dem TodoNotiz Objekt zuzugreifen?
    • Ich hau dir jetzt mal das hier um die Ohren ;) :

      Quellcode

      1. NSSet* set = self.todoEintrag.toTodoNotiz;
      2. NSArray* array = [set allObjects];
      3. self.notiz_textfield.text = [array objectAtIndex:0].notiz;


      Und nun überlege mal, warum da jetzt ein NSString Objekt dem Textfeld zugewiesen wird.
      Anmerkung: dem Code mangelt es natürlich noch an Überprüfungen, ob es überhaupt eine Notiz gibt oder mehr als eine. Aber der Code ist ja auch, bis auf sechs Zeichen, von dir. :P