datenspeicherung

  • datenspeicherung

    Hallo, ich habe ein Problem mit der Datenspeicherung auf dem iPad.
    Wenn ich meine App mit xCode starte und ein neues NSManagedObject anlege kann ich dort meine Daten eintragen.
    Wenn ich die App übers iPad beende und wieder starte ist das Object noch bestückt, wenn ich sie jedoch nochmals über xCode starte oder das iPad reboote, existiert zwar noch das Object aber die eingetragenen Daten sind weg.

    ArtikelOverviewController.m

    Quellcode

    1. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. NSManagedObject *artikel = [fetchedResultsController objectAtIndexPath:indexPath];
    4. DetailedViewController *detailController = [[DetailedViewController alloc]initWithNibName:nibName bundle:nil];
    5. detailController.artikel = artikel;
    6. [self.navigationController pushViewController:detailController animated:YES];
    7. [detailController release];
    8. }

    Quellcode

    1. - (NSFetchedResultsController *)fetchedResultsController
    2. {
    3. if(fetchedResultsController != nil) return fetchedResultsController;
    4. NSFetchRequest *fetchedRequest = [NSFetchRequest new];
    5. NSEntityDescription *artikelDescription = [NSEntityDescription entityForName:@"Artikel" inManagedObjectContext:managedObjectContext];
    6. [fetchedRequest setEntity:artikelDescription];
    7. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc]initWithKey:@"datum" ascending:NO];
    8. NSArray *sortDescriptors = [[NSArray alloc]initWithObjects:sortDescriptor,nil];
    9. [fetchedRequest setSortDescriptors:sortDescriptors];
    10. fetchedResultsController = [[NSFetchedResultsController alloc]initWithFetchRequest:fetchedRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Overview"];
    11. fetchedResultsController.delegate = self;
    12. [fetchedRequest release];
    13. [sortDescriptor release];
    14. [sortDescriptors release];
    15. return fetchedResultsController;
    16. }
    Alles anzeigen

    Quellcode

    1. - (IBAction)neuerArtikel
    2. {
    3. NSEntityDescription *artikelDescription = [[fetchedResultsController fetchRequest] entity];
    4. NSManagedObject *newArtikel = [NSEntityDescription insertNewObjectForEntityForName:[artikelDescription name] inManagedObjectContext:managedObjectContext];
    5. [newArtikel setValue:NSLocalizedString(@"neuerArtikel",nil) forKey:@"titel"];
    6. [newArtikel setValue:[NSDate date] forKey:@"datum"];
    7. [newArtikel setValue:[[NSUserDefaults standardUserDefaults] stringForKey:@"autor"] forKey:@"autor"];
    8. NSError *error;
    9. if(![managedObjectContext save:&error])
    10. {
    11. NSLog(@"Fehler beim Anlegen eines neuen Artikels");
    12. }
    13. DetailedViewController *detailController = [[DetailedViewController alloc]initWithNibName:nibName bundle:nil];
    14. detailController.artikel = newArtikel;
    15. [self.navigationController pushViewController:detailController animated:YES];
    16. [detailController release];
    17. }
    Alles anzeigen


    DetailedViewController.m

    Quellcode

    1. - (UITableViewCell *)tableView:(UITableView *)tableView cellForRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. UITableViewCell *cell = nil;
    4. if(indexPath.section == kAngebotSection)
    5. {
    6. static NSString *TextCellIdentifier = @"TextCell";
    7. cell = [tableView dequeueReusableCellWithIdentifier:TextCellIdentifier];
    8. if (cell == nil)
    9. {
    10. cell = [[[UITableViewCell alloc] initWithStyle:UITableViewCellStyleValue1 reuseIdentifier:TextCellIdentifier] autorelease];
    11. }
    12. cell.textLabel.text = NSLocalizedString(@"Angebot",nil);
    13. cell.detailTextLabel.text = [artikel valueForKey:@"angebot"];
    14. cell.accessoryType = UITableViewCellAccessoryDisclosureIndicator;
    15. }
    16. //...
    17. return cell;
    18. }
    Alles anzeigen

    Quellcode

    1. - (void)tableView:(UITableView *)tableView didSelectRowAtIndexPath:(NSIndexPath *)indexPath
    2. {
    3. if(indexPath.section == kAngebotSection)
    4. {
    5. pickerViewController.artikel = artikel;
    6. pickerViewController.title = NSLocalizedString(@"Angebot",nil);
    7. pickerViewController.key = @"angebot";
    8. [self.navigationController pushViewController:pickerViewController animated:YES];
    9. }
    10. //...
    11. }
    Alles anzeigen


    PickerViewController.m

    Quellcode

    1. -(void)viewWillAppear:(BOOL)animated
    2. {
    3. UIBarButtonItem *doneButton = [[UIBarButtonItem alloc]initWithBarButtonSystemItem:UIBarButtonSystemItemDone target:self action:@selector(fertig)];
    4. self.navigationItem.rightBarButtonItem = doneButton;
    5. [doneButton release];
    6. arrView = [[NSMutableArray alloc] init];
    7. if([key isEqualToString:@"angebot"])
    8. {
    9. [arrView addObject:@"Unterkunft"];
    10. [arrView addObject:@"Aktivität"];
    11. [arrView addObject:@"Gutschein"];
    12. }
    13. //...
    14. [pickerView setDataSource:self];
    15. [pickerView setDelegate:self];
    16. }
    Alles anzeigen

    Quellcode

    1. -(IBAction)fertig
    2. {
    3. [artikel setValue:[arrView objectAtIndex:[pickerView selectedRowInComponent:0]] forKey:key];
    4. [self.navigationController popViewControllerAnimated:YES];
    5. }


    Vielleicht kann mir da jemand helfen, ich find den Fehler nicht.
  • Du rufst diese Methode:

    - (NSFetchedResultsController *)fetchedResultsController (Man beachte das Minuszeichen)

    mit diesen Argumenten auf:

    NSManagedObject *artikel = [fetchedResultsController objectAtIndexPath:indexPath];

    Wo liegt da der Sinn ? Wenn fetchedResultsController==nil ist, dann würde die Methode ja gar nicht aufgerufen, oder denke ich jetzt verkehrt ?

    Gruß

    Claus
    2 Stunden Try & Error erspart 10 Minuten Handbuchlesen.

    Pre-Kaffee-Posts sind mit Vorsicht zu geniessen :)
  • orthmac schrieb:

    if(fetchedResultsController != nil) return fetchedResultsController;

    Das heißt doch, wenn es einen gibt, dann soll er ihn ausgeben und wenn nicht, einen neuen erstellen.

    Gibt es eine Möglichkeit, um nachzuschauen, ob die Daten auch wirklich im NSManagedObject gespeichert werden? Also irgendwie in einer SQL-Datei oder so...
  • orthmac schrieb:

    Christian Kienle schrieb:

    Nach einem Clean-Build sind alle Daten weg.
    Aber nach dem das iPad neu gestartet wurde sollen die Daten doch noch vorhanden sein.


    Ja aber er schrieb ja, dass er auch via Xcode die App neu startet und da nicht klar ist wie genau er dies macht kann davon ausgegangen werden, dass er es über einen Clean-Build macht, was zu dem oben beschriebenem führen kann.
    Die Objective-Cloud ist fertig wenn sie fertig ist. Beta heißt Beta.

    Objective-C und Cocoa Band 2: Fortgeschrittene
    Cocoa/Objective-C Seminare von [co coa:ding].