Mit Core Data gespeichertes Datum in der Kopfzeile einer Tabelle anzeigen!?

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

  • Mit Core Data gespeichertes Datum in der Kopfzeile einer Tabelle anzeigen!?

    Hallo liebe Entwicklergemeinde,
    ich versuche ein gespeichertes Datum (über Core Data) in einer Tabelle als Kopfzeile / Überschrift anzeigen zu lassen und komme leider nicht weit...

    mein Code:

    - (NSString *)tableView: (UITableView *)tableView titleForHeaderInSection: (NSInteger)section {
    MyObjects *myObjects = [[fetchedResultsController sections] objectAtIndex:section];
    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];
    [dateFormatter setDateStyle: NSDateFormatterShortStyle];
    [dateFormatter setTimeStyle: NSDateFormatterShortStyle];
    NSString *actualDate = [dateFormatter stringFromDate:myObjects.actDate];
    return actualDate;
    }

    meine Fehlermeldung:

    2010-10-19 21:29:55.243 MyApp[5158:207] -[_NSDefaultSectionInfo actDate]: unrecognized selector sent to instance 0x6157470

    2010-10-19 21:29:55.245 MyApp[5158:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSDefaultSectionInfo actDate]: unrecognized selector sent to instance 0x6157470'



    Kann mir jemand dabei helfen und mir erklären was ich falsch mache!?
    Vielen Dank im voraus...
  • lipdila schrieb:

    2010-10-19 21:29:55.243 MyApp[5158:207] -[_NSDefaultSectionInfo actDate]: unrecognized selector sent to instance 0x6157470
    2010-10-19 21:29:55.245 MyApp[5158:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_NSDefaultSectionInfo actDate]: unrecognized selector sent to instance 0x6157470'


    Gruß
    Manfred

    EDIT: Hat dein Code merkwürdige gelbe Flecken :whistling:

    EDIT2: Ach so, CoreData: Überprüfe den Namen der Property

    EDIT3: myObject ist ein NSSet. Da musst du erst dein ManagedObject rausholen und dem dieNachricht schicken. Dann könnte actDate schon richtig sein.

    EDIT4: Vergiss EDIT3, du hast ja nen FetchController und keinen direkten fetch ;)
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.

    Dieser Beitrag wurde bereits 3 mal editiert, zuletzt von Manfred Kreß ()

  • Hi Manfred,
    danke schoneinmal für deine schnelle Antwort.

    Zu deiner Anmerkung:

    EDIT2: Ach so, CoreData: Überprüfe den Namen der Property --> Namen der Property überprüft und korrekt!

    Ich vermute ja das ich irgendwie einen Fehler mache beim abfragen der gespeicherten Daten. Vermutlich in der Zeile:
    MyObjects *myObjects = [[fetchedResultsController sections] objectAtIndex:section];

    Aber ich weiß nicht wo?
    Muss dazu sagen...Ich bin Anfänger. Vermutlich ein simpler Fehler nur ich Vogel finde den wieder nicht!?

    Noch jemand Ideen?

  • Wie wäre es mal mit einer Abfrage auf nil vom myObjects nach dem Fetch ? Das sollte da eh hingehören.

    Wenn Du das Attribute actData der CoreData nachträglich hinzugefügt hast, dann musst du das App auf dem Simulator/Device unbedingt komplett löschen und ein Clean all Targets machen.

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Die Fehlermeldung besagt, das dein Objekt die Methode actDate nicht kennt.

    sections gibt dir ein Array mit Objekten, die konform zum NSFetchedResultsSectionInfo Protokoll sind, also keine Objekte irgendeiner Entity von dir selbst. Was da drin steht setzt du über den sectionNameKeyPath. Hier müstest du dafür sorgen, das schon beim Fetch automatisch das Formatierte Datum zurückgegeben wird und dann in indexTitle des NSFetchedResultsSectionInfo konformen Objekts hinterlegt wird.

    Wenn du mich fragst, macht der NSFetchedResultsController hier mehr Ärger als er nützt. Die paar Fetches schnell von "Hand" zu machen ist denke ich weniger Arbeit als den ganzen Kram NSFetchedResultsController konform umzubiegen. Eigentlich frage ich mich bei dem Ding jedesmal was es bringen soll.

    Wie schon gesagt, log doch mal etwas, um zu sehen was da eigentlich ankommt.
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Hi Manfred,
    du hast recht, wenn ich actDate via. NSLog(@"%@"); auslesen will, bekomme ich die selbe Fehlermeldung :(

    Leider habe ich bis jetzt nur die Möglichkeit über den NSFetchedResultsController kennen gelernt.
    Wie wäre denn die direkte Abfrage der Daten möglich? Wie gesagt, bin noch Anfänger und finde
    das ganze Thema mit Core Data sehr gewöhnungsbedürftig.
  • Quellcode

    1. NSManagedObjectContext *context = [del managedObjectContext];
    2. NSEntityDescription *itemsDescription = [NSEntityDescription entityForName:@"Items" inManagedObjectContext: context];
    3. // Eine Predicate
    4. NSPredicate *predicate = [NSPredicate predicateWithFormat: @"Group == %@", group];
    5. // daraus einen Fetch
    6. NSFetchRequest *fetch = [[NSFetchRequest alloc] init];
    7. [fetch setEntity: itemsDescription];
    8. [fetch setPredicate: predicate];
    9. //
    10. NSError *fetchError = nil;
    11. NSArray *result = [context executeFetchRequest: fetch error: &fetchError];
    12. if (fetchError != nil)
    13. {
    14. NSLog(@"error");
    15. return ;
    16. }
    17. NSLog(@"array %@", result);
    18. [fetch release];
    Alles anzeigen


    Du brauchst den Context und die Entitydescription, da gibts hundert Wege sich die zu besorgen. Dann eine Predicate, die beschreibt, was du überhaupt haben willst. Daraus wird ein fetch gebaut und dann wird sie von Context ausgeführt.

    bin noch Anfänger und finde das ganze Thema mit Core Data sehr gewöhnungsbedürftig.


    Ich auch ;)
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Hey Manfred,
    vielen Dank schonmal :)Werde es gleich heute Abend mal so versuchen.

    Irgendwie ist das schon alles blöde...
    Wenn ich die Daten abrufe und habe anstatt sections ein indexPath wie z.B. in

    - (void)configureCell: (UITableViewCell *)cell atIndexPath: (NSIndexPath *)indexPath {

    dann funktioniert die Abfrage.
    Naja, ich denke das ich den NSFetchedResultsController umgehen werde, wie von dir beschrieben!
    Gruß Dirk
  • Habe ich schon einmal erwähnt, das ich Core Data hasse!!!?

    Was will ich machen:
    Ich habe eine View, die ich über eine TableView (mit CoreData) aufrufe. In der View sind 2x UITextFields sowie ein UISegmentedControll über das ich das FireDate für die UILocalNotification aussuche und setze!
    Über beide UITextFields speichere ich mir die Texteingabe in meine CoreData Datenbank ab!
    Ich übergebe UILocalNotification "userInfo" das "fireDate" damit ich später (wenn die Notification auslöst) eine Zuordnung meiner CoreData Daten machen kann:
    NSDictionary *infoDict = [NSDictionary dictionaryWithObject:myObjects.remindDate forKey:@"remindDate"];
    localNotif.userInfo = infoDict;


    Sobald ich nun die LocalNotification erhalten habe, möchte ich die Daten wieder auslesen und in einer eigenen View (DetailViewController) anzeigenlassen (In der View sind 2x UITextFields sowie ein UISegmentedControll). Die Daten firstObject und secondObject sollen jeweils in die UITextFields rein! Hierbei stürzt aber mein App immer wieder ab mit folgendem Fehler:
    2010-10-23 00:58:22.146 Test[4409:207] -[_PFBatchFaultingArray firstObject]: unrecognized selector sent to instance 0x616eb30

    2010-10-23 00:58:22.148 Test[4409:207] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[_PFBatchFaultingArray firstObject]: unrecognized selector sent to instance 0x616eb30'





    Habe es nun wie von Manfred erklärt versucht den NSFetchedResultsController zu umgehen. Soweit so gut....
    Wenn ich nun die Daten auslese und über den predicate eingrenze, bekomme ich auch folgende Ausgabe hin (via. NSLog Funktion):2010-10-23 00:58:22.136 Test[4409:207] push the View

    2010-10-23 00:58:22.137 Test[4409:207] komplett myObjects = (


    " (entity: Event; id: 0x6166430 ; data: {\n firstObject = \"2 hours\";\n remindDate = \"2010-10-22 22:58:22 GMT\";\n secondObject = \"2 Stunden\";\n})


    Somit habe ich genau die Daten, die ich haben wollte. In meiner CoreData Datenbank stehen noch mehr Daten drinn, allerdings jeweils mit einem anderem remindDate!
    Zum Vergleich, wenn ich die Daten aus meinem RootViewController (Tabllenansicht mit NSFetchedResultsController) auslese, erhalte ich folgende Ausgabe (ebenso mit NSLog):
    komplett myObjects = (entity: Event; id: 0x6166430 ; data: {

    firstObject = "2 hours";

    remindDate = "2010-10-22 22:54:40 GMT";

    secondObject = "2 Stunden";

    })

    2010-10-23 00:58:15.860 Test[4409:207] erstes Feld = 2 hours

    2010-10-23 00:58:15.861 Test[4409:207] zweites Feld = 2 Stunden



    Hier ist die Ausgabe irgendwie formatiert!
    Liegt hier der Fehler? Ich sitze seit mehreren Stunden da dran und komme nicht weiter... Mache ich einen Fehler bei der Abfrage?
    Benötige dringend Unterstützung und bin für jeden Info dankbar....

    Auszug aus meinem Quellcode füge ich gleich mit an...
  • Hier der QuellCode bzw. ein Auszug:
    Auszug aus meiner AppDelegate.m:
    - (void)application: (UIApplication *)app didReceiveLocalNotification: (UILocalNotification *)notif {



    NSManagedObjectContext *context = [self managedObjectContext];


    NSEntityDescription *itemsDescription = [NSEntityDescription entityForName:@"Event" inManagedObjectContext: context];



    NSPredicate *predicate = [NSPredicate predicateWithFormat: @"remindDate == %@",notif.fireDate];

    NSFetchRequest *fetch = [[NSFetchRequest alloc] init];

    [fetch setEntity: itemsDescription];

    [fetch setPredicate: predicate];






    NSError *fetchError = nil;

    NSArray *result = [context executeFetchRequest: fetch error: &fetchError];



    if (fetchError != nil)

    {

    NSLog(@"error");

    return ;

    }



    NSLog(@"array %@", result);

    NSLog(@"push the View \n");



    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]];

    MyObjects *myObjects = (MyObjects* )result;

    detailViewController.myObjects = myObjects;

    NSLog(@"komplett myObjects = %@",myObjects);

    [self.navigationController pushViewController:detailViewController animated:YES];

    [fetch release];


    }


    Auszug aus meinem DetailViewController:


    - (void)viewDidLoad {



    NSLog(@"view did load .:: DetailViewController::");



    [super viewDidLoad];



    self.title = @"my object";

    // self.navigationItem.prompt = @"create a new object";

    self.navigationItem.leftBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemCancel target:self action:@selector(cancle: )] autorelease];

    self.navigationItem.rightBarButtonItem = [[[UIBarButtonItem alloc] initWithBarButtonSystemItem:UIBarButtonSystemItemSave target:self action:@selector(save: )] autorelease];

    NSLog(@"komplett myObject = %@",myObjects);

    NSLog(@"erstes Feld = %@", myObjects.firstObject);

    NSLog(@"zweites Feld = %@", myObjects.secondObject);

    originalTextField.text = myObjects.firstObject;

    translationTextField.text = myObjects.secondObject;



    // configure the remindDateTextField output

    NSDateFormatter *dateFormatter = [[[NSDateFormatter alloc] init] autorelease];

    // Style for the date

    [dateFormatter setDateStyle:NSDateFormatterMediumStyle];

    // Style for the time

    [dateFormatter setTimeStyle:NSDateFormatterMediumStyle];

    // convert the NSDate in a String

    NSString *actualRemindDate = [dateFormatter stringFromDate:myObjects.remindDate];



    remindDateTextField.text = actualRemindDate;

    }

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

  • detailViewController.MyObjects = myObjects;

    hast du die Variable im Controller wirklich so genannt wie die Klasse selber (das macht man nämlich nicht) oder müßte es viel mehr

    detailViewController.myObjects=myObjects;

    oder ähnlich heissen ?

    GRuß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • Hi Claus,
    du hast recht. Hier hat sich ein Fehler eingeschlichen!?
    Ich frag mich gerade nur wie...Im meinem Xcode Quellcode habe ich ihn nicht gemacht und sonst fast nur mit Copy & Paste gearbeitet!?!? ?(
    Naja, wird schon irgendwie passiert sein, war ja schon spät :D
    Danke schonmal...werde es zur Einfachheit im alten Beitrag korrigieren !!

    Es heißt richtig:
    detailViewController.myObjects = myObjects;
  • Juppi... Ich habe es endlich hin bekommen!
    Danke an alle noch einmal für eure Hilfe und Unterstützung.

    Für alle die es interessiert, hier die Lösung FETT markiert:

    NSArray *array = [context executeFetchRequest: fetchRequest error:nil];
    DetailViewController *detailViewController = [[DetailViewController alloc] initWithNibName:@"DetailViewController" bundle:[NSBundle mainBundle]];

    MyObjects *myObjects = (MyObjects* )[array objectAtIndex:NO];
    detailViewController.myObjects = myObjects;
    NSLog(@"komplett myObjects = %@",myObjects);
    [self.navigationController pushViewController:detailViewController animated:YES];


    [fetch release];



  • Da hast du schon recht. Sehr viel Glück....
    Ich verstehe es auch nicht wirklich. Kam einfache nicht weiter und habe es
    dann mit ein bischen rumspielen hinbekommen...elegant sicherlich nicht, aber ich
    habe meine Daten aus der CoreData Datenbank auslesen können! Somit für mich effektiv.
    Hoffe nur das das ganze auch stabil läuft....

    Kennst du eine bessere Lösung?
    Will das ganze ja auch irgendwie verstehen :)
  • Du nimmst einfach den Inhalt des ersten Objektes in deinem Array.

    Du meinst in deinem Code sinngemäß: "Hol mir aus Array ein Objekt ohne Index."
    Das funktioniert nicht.

    Per Zufall/Glück/sonstwas interpretiert der Compiler daraus "Hol mir aus Array ein Objekt an Index 0"

    Ersetze NO durch 0, dann sieht es auch wieder vernünftig aus.
    Aber eigentlich müsste die Nummer der aktuellen Zeile da rein. ;)
    «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