Core Data Relationship fetchrequest in TableView zählen / Keypath Error

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

    • Core Data Relationship fetchrequest in TableView zählen / Keypath Error

      Hallo Zusammen,

      mein Ziel ist recht einfach. Ich habe zwei Entities, die in einer 1:n-Beziehung stehen. Dazu gibt es zwei TableViewController. Auf dem ersten TVC möchte ich die Einträge des ersten Entity anzeigen und dazu gehörig die Anzahl der "n"-Beziehungen. Die Entities heissen "Overview" und "Detaillist". Die Anzahl der Detaillist-Einträge zum passenden Overview-Eintrag sollen in jeder Tabellen-Zelle angezeigt werden.

      Relationship vom Overview zur Detaillist lautet 'detail' - und umgekehrt 'overview'. In beiden Entities gibt es u.a. jeweils ein Attribut 'title'

      Mein Code für die Konfiguration der TableViewCell

      Quellcode

      1. - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
      2. {
      3. // Vorbereitung Attribute aus Overview-Entity
      4. Overview *overview = [_frc objectAtIndexPath:indexPath];
      5. //Vorbereitung Counting
      6. NSFetchRequest *countingRequest = [[NSFetchRequest alloc] init];
      7. [countingRequest setIncludesSubentities = YES];
      8. [countingRequest setEntity:[NSEntityDescription entityForName:@"Overview" inManagedObjectContext:self.moc]];
      9. [countingRequest setPredicate:[NSPredicate predicateWithFormat:@"Overview.title == %@", overview.title]];
      10. NSInteger anzahl = [self.moc countForFetchRequest:countingRequest error:nil]; //!!! Abbruch hier
      11. // Ausgabe
      12. cell.textLabel.text = overview.title; // funktioniert
      13. NSLog(@"Für cell.detailTextLabel.text zeige die Anzahl %i, anzahl);
      14. }
      Alles anzeigen


      Die Fehlermeldung, die ich bekomme lautet "keypath Overview.title not found in entity <NSSQLEntity Overview id=2>"
      Wahrscheinlich habe ich das setEntity und den Predicate total falsch aufgebaut ...

      Nur falls sich jemand über die Methode wundert, ist aus den Std.Apple-Vorlagen kopiert.
      Die Methode wird in -tableView:cellForRowAtIndePath aufgerufen. Das klappt ja auch bereits ohne Probleme.

      fetchedResultsController ist auch in eigener Methode ausgelagert. Aber der wird ja nur zu Beginn der View einmal aufgerufen und liefert ja auch die richtigen Ergebnisse aus, sollte also irrelvant sein. Deswegen baue ich ja auch in der configureCell:atIndexPath einen neuen FetchRequest für die Zählerei auf.

      Danke für Eure Unterstützung.
      (nur der Form halber ... ich habe selbstverständlich vorweg in diesem und anderen Foren gesucht. Da wird auch prima die Zählweise mit countForFetchRequest erläutert, aber irgendwas stimmt mit meinem setEntity noch nicht).

      Gruß
      Horst
      ----
      Macht's gut und danke für den Fisch
    • C-Quellcode

      1. [countingRequest setEntity:[NSEntityDescription entityForName:@"Overview" inManagedObjectContext:self.moc]];
      2. [countingRequest setPredicate:[NSPredicate predicateWithFormat:@"Overview.title == %@", overview.title]];

      Overview.title gibt es dort nicht. Du hast ja bereits eine Entity vom Typ Overview, welches sicherlich keine Relationship Overview haben dürfte.
      Du möchtest also vermutlich eher eine Entity vom Typ 'Detaillist' haben.

      ABER:
      ich halte das für Blödsinn. Denn das Overview-Objekt weiß doch von ganz allein, wie viele Detaillist Objekte es hat. Da muss man nicht Core Data bemühen.

      C-Quellcode

      1. - (void)configureCell:(UITableViewCell *)cell atIndexPath:(NSIndexPath *)indexPath
      2. {
      3. // Vorbereitung Attribute aus Overview-Entity
      4. Overview *overview = [_frc objectAtIndexPath:indexPath];
      5. //Vorbereitung Counting
      6. NSInteger anzahl = [[overview detaillist] count];
      7. // Ausgabe
      8. cell.textLabel.text = overview.title; // funktioniert
      9. NSLog(@"Für cell.detailTextLabel.text zeige die Anzahl %i, anzahl);
      10. }
      Alles anzeigen


      Core Data ist auch in iOS 6.0 noch immer keine Datenbank.

      Weiterhin bin ich der irrsinnigen Meinung, dass der FetchResultController eigentlich nur einmalig auf dem ersten Screen genutzt werden und man im Anschluss stumpf die über die Auswahl gesammelten Objekte weitergereicht werden sollte.
      «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
    • Lucas de Vil schrieb:

      //Vorbereitung Counting
      NSInteger anzahl = [[overview detaillist] count];
      Danke für Deine schnelle Antwort. Ich bin ja schonmal erleichtert, den FRC nicht bei jeder Abfrage aufbauen zu müssen (in den nachfolgenden tableViews gebe ich die geladenen Objekte weiter, wie Du auch beschrieben hast).

      Ich habe anbei noch mal mein Datenmodell angehängt. Bei Deinem Vorschlag bekomme ich "No visible @interface for 'Overview' declares the selector 'Detaillist' ".
      Muss ich in die NSManagedObject-Klassen zu den beiden Entities noch zusätzlichen Code einbauen?
      Im Moment gibt es nur die jeweiligen properties für die Attribute und jeweils ein property für die Beziehung:

      Overview.h

      Quellcode

      1. @class Detaillist;
      2. @interface Overview : NSManagedObject
      3. ...
      4. @property (nonatomic, retain) Detailist *detail
      5. @end


      Und in Detaillist.h

      Quellcode

      1. ...
      2. @property (nonatomic, retain) Overview *overview;


      [Blockierte Grafik: http://dl.dropbox.com/u/6711665/2013-01-16CD.png]

      Zweites Mal Danke.
      Gruß
      Horst
      ----
      Macht's gut und danke für den Fisch
    • Naja, die Relationship heißt 'detail'.
      Also heißt die Methode [[overview detail] count];

      Übrigens wäre 'details' als Name für die Relationship besser, da sie erkenne lässt, dass es mehrere gibt.
      Und DetailList als Objektnamen finde ich unpassend, da es ja immer nur ein Objekt ist.

      Das, was da in den Boxen steht ist auch schon der jeweilige Methodenname, den du nehmen kannst.
      «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