TableView, Sections, Rows und coreData - Mehrfacher Inhalt

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

  • TableView, Sections, Rows und coreData - Mehrfacher Inhalt

    Hallo Leute,

    ich lese aus coreData Daten in die Tabelle ein. Einmal für die Sections und einmal für die Rows.
    Mein coreData ist so aufgebaut, wie dieses bild hier: blog.sallarp.com/wp-content/up…Object-Model-2-300x91.png
    (Ein bild von dieser Seite: blog.sallarp.com/iphone-core-data-uitableview-drill-down/)

    Mein Schema:

    EntitySet <---------->> EntityRow <---------->>EntityDetails


    Das einlesen der Sections und der Rows funktioniert. Allerdings habe ich das Problem, dass einfache ALLE Daten der EntityRow in jeder Section angezeigt werden.
    Was kann hierbei falsch sein? Fehler bei den Relationships oder eher ein Fehler in der Methode tableView:cellForRowAtIndexPath: ?

    Ich bin davon ausgegangen, dass coreData es mit den Relationships bereits löst. Jetzt bin ich auf dem Weg, meinen Fehler zu finden, bzw. das Problem zu lösen,
    sodass in den Sections, nur DIE rows angezeigt werden soll, denen diese zugehören.

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    2. static NSString *CellIdentifier = @"Cell";
    3. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    4. if (cell == nil) {
    5. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    6. }
    7. EntityRows *rows = [_rowsX objectAtIndex:indexPath.row];
    8. cell.textLabel.text = rows.title;
    9. return cell;
    10. }
    Alles anzeigen


    Herzlichen Dank für jegliche Hilfe,
    brush51

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von brush51 () aus folgendem Grund: Überschrift angepasst

  • Holla,

    also ich weiss ja nicht wo deine _rowX-ivar herkommt oder befüllt wird, aber ich nehme mal an da liegt der Hase im Pfeffer. Wenn du an dieser Stelle je nachdem in welcher Section du bist eine andere Menge an Elementen anzeigen willst, solltest du auch danach auflösen. An deiner Stelle würde ich mir irgendwo als ivar nen Array mit meinen Sections halten, und je nachdem in welcher Section ich bin eben das richtige Element abgreifen.. like..

    Quellcode

    1. -(void)irgendwo { self.sections = /* Irgendein Fetchrequest, wie auch immer */; }
    2. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    3. static NSString *CellIdentifier = @"Cell";
    4. UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier];
    5. if (cell == nil) {
    6. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease];
    7. }
    8. EntitySection* section = [sections objectAtIndex:indexPath.section];
    9. EntityRows *rows = [section.rows objectAtIndex:indexPath.row];
    10. cell.textLabel.text = rows.title;
    11. return cell;
    12. }
    Alles anzeigen



    Allerdings kannst du dir diese Schmerzen schon auch ersparen in dem du dir mal den FetchedResultsController anschaust.
  • Hallo derwildemomo,
    meine _rowX ist ein NSArray:

    Quellcode

    1. @synthesize rowX = _rowX;


    Und in der ViewDidLoad methode:

    Quellcode

    1. NSManagedObjectContext *context = [self managedObjectContext];
    2. NSError *error = nil;
    3. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    4. NSEntityDescription *entity = [NSEntityDescription entityForName:@"EntityRow" inManagedObjectContext:context];
    5. [fetchRequest setEntity:entity];
    6. //NSArray *fetchedObjects = [context executeFetchRequest:fetchRequest error:&error];
    7. self.rowX = [context executeFetchRequest:fetchRequest error:&error];


    Wie funktioniert das abgreifen des richtigen Elements für die Section? Ich blicke bei coreData da noch nicht so durch.
    Ich habe die Relationen erstellt, doch es gibt kein Attribut was verglichen wird oder dergleichen.
    Wie funktioniert das in coreData?
  • Ich werd mal ein bisschen Abstrakter, um mit den Begriffen nicht zu kollidieren. Wir stellen uns vor du implementierst eine tableview, die Fußballvereine und ihre Spieler anzeigen soll. Dazu hast du dir erstmal ein Datenmodell angelegt, dass zwei Entitäten kennt, Fussballvereine und.. Spieler. Fussballvereine haben viele Spieler, ein Spieler hat genau einen Fussballverein. Wir gehen davon aus dass die Relation in der Fussballverein-Entität "players" heisst ( nicht spieler, da hier singular und plural im deutschen gleich sind ).

    Jetzt möchtest du sinnvollerweise Für jeden Club eine Section in deiner TableView haben, und in der Section sollen dann alle Spieler angezeigt werden. Um das zu bewerkstelligen, Legst du dir irgendwo erstmal einen Array mit allen Clubs an, schließlich kannst du über diese Information ja auch alle Spieler über die Relation abgreifen.

    In deiner .. viewWillAppear oder sonstwo haste jetzt also einen FetchRequest der ungefähr so aussieht.

    Quellcode

    1. /* Context ist schon da */ NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    2. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Fussballverein" inManagedObjectContext:context];
    3. [fetchRequest setEntity:entity];
    4. self.fussballvereine = [context executeFetchRequest:fetchRequest error:&error];



    soweit so gut, alle glücklich. Jetzt zu den Methoden für die UITableViewDatasource-Implementation.

    Quellcode

    1. - (NSInteger)numberOfSectionsInTableView:(UITableView *)tableView


    klarer Fall, diese Methode liefert die Anzahl der Elemente in deinem fussballverein-array zurück.


    Jetzt zu der

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath {
    2. static NSString *CellIdentifier = @"Cell"; UITableViewCell *cell = [tableView dequeueReusableCellWithIdentifier:CellIdentifier]; if (cell == nil) { cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleDefault reuseIdentifier:CellIdentifier] autorelease]; } Fussballverein* verein = [self.fussballvereine objectAtIndex:indexPath.section]; Spieler *spieler = [verein.players objectAtIndex:indexPath.row]; cell.textLabel.text = spieler.name;
    3. return cell;}



    kannst damit was anfangen?

    Dieser Beitrag wurde bereits 1 mal editiert, zuletzt von derwildemomo ()

  • Herzlichen Dank für die detaillierte Hilfe.

    Genau das, was ich bisher umgesetzt habe.
    Die Anzahl der Sections bekomme ich auch richtig zurück. Die Sections werden auch korrekt angezeigt.

    Ich denke aber ich habe meinen Fehler verstanden und werde es jetzt mal versuchen zu lösen.
    Wenn ich gelöst habe, werde ich meine Lösung hier posten,
    wenn ich weitere Probleme werde ich mich noch einmal melden :).


    Herzlichen Dank für den Denkanstoß!
  • Ich hab das jetzt mal so gemacht wie du es erklärt hast.
    So, nun habe ich die Relationen nochmal geprüft, die alten Objekte gelöscht und neu generiert.

    Quellcode

    1. // Configure the cell.
    2. EntitySections *sections = [self.allSets objectAtIndex:indexPath.section];
    3. EntityRows *rows = [sections.relationsNameVonSectionsToRows objectAtIndex:indexPath.row];
    4. NSLog(@"rows.title: %@", rows.title);
    5. cell.textLabel.text = rows.title;
    6. return cell;


    relationsNameVonSectionsToRows ist vom Typ NSSet, ist mir aufgefallen. Ist das soweit korrekt?
    Der Debugger stoppt bei Zeile 3 und gibt als fehlermeldung:

    Quellcode

    1. -[_NSFaultingMutableSet objectAtIndex:]: unrecognized selector sent to instance 0x4ea5060
    2. *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSFaultingMutableSet objectAtIndex:]: unrecognized selector sent to instance 0x4ea5060'


    Das es vom Typ NSSet ist, ist wahrscheinlich nicht korrekt oder?
  • dass die Relation ein NSSet ist ist für < iOS5 leider eine traurige Tatsache, da ordered Relationships erst in iOS5 zum Funktionsumfang gehören. Wenn die Reihenfolge keine Rolle spielt kannst du dir über die methode allObjects von NSSet einen Array generieren lassen, auf den du dann objectAtIndex: aufrufen kannst. Allerdings ist diese Lösung eher unschön – "normalerweise" führt man noch zusätzlich eine "index" variable in der abhängigen Entität ein, die dann die Sortierreihenfolge bestimmt. Damit kannst du dann relativ einfach einen sortierten Array erzeugen. Ansonsten: well done, sir :)