Anfängerfrage für Core Data Zugriffe

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

  • Anfängerfrage für Core Data Zugriffe

    Hallo zusammen,

    Ich bin noch relativ neu in der iPhone-OS-Programmierung und habe leichte Verständnisschwierigkeiten im Bereich CoreDataProgramming.

    Problemstellung:
    Ich möchte die Möglichkeit bieten, Spielerprofile anzulegen. Innerhalb dieser Profile dürfen diverse Sets angelegt werden, die diverse Fotos beinhalten können und sollen.

    Lösungsansatz:
    Ich habe eine Anwendung auf Basis eines SplitViewControllers erstellt und den Table-MasterViewController gegen einen normalen UIViewController ausgetauscht.
    Ich habe 3 Entitäten angelegt die jeweils mittels 1-to-many-Relation verbunden sind. Als 1 User kann mehrere Sets erstellen, die wiederrum mehrere Photos enthalten können.
    Im MasterViewController habe ich den fetchedResultsController angelegt und die "oberste" Entität (die mit den Usernamen) als NSEntityDescription angegeben.
    Die Sortierung ist dabei nach Usernamen aufsteigend eingerichtet.
    Da ich die Eingabe der Daten nicht im schmalen MasterView vornehmen möchte sondern im wesentlich übersichtlicheren DetailView, habe ich mir einen entsprechenden ViewController erstellt, der mittels IBAction über den MasterViewController initialisiert und angezeigt wird.
    Der DetailViewController enthält ein einfaches Textfeld über das der Spielername eingegeben und mittels Hook beim Wegklicken des Keyboards gespeichert werden soll. Das Problem dabei ist, das mit Im Log folgendes ausgegeben wird und die Anwendung im Anschluss crasht.

    Logausgabe beim Crash

    Quellcode

    1. *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name 'Usernames''


    Das ist die SaveFunktion des DetailViewControllers

    Quellcode

    1. NSLog(@"saveNewPictureSetName");
    2. if (masterViewController.fetchedResultsController != nil)
    3. {
    4. NSLog(@"FRC ist nicht gefüllt");
    5. NSError *error;
    6. [masterViewController.fetchedResultsController performFetch:&error];
    7. }
    8. NSManagedObjectContext *context = [self.username managedObjectContext];
    9. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Usernames"
    10. inManagedObjectContext:context];
    11. NSLog(@"Entityname = %@", [entity name]);
    12. NSManagedObject *usernames = [NSEntityDescription
    13. insertNewObjectForEntityForName:[entity name]
    14. inManagedObjectContext:context];
    15. [masterViewController unsetActivePhotoSet];
    16. [usernames setValue:[NSString stringWithFormat:@"%@", newProfileName.text] forKey:@"name"];
    17. [usernames setValue:[NSNumber numberWithInt:1] forKey:@"active"];
    18. NSError *error = nil;
    19. if ([context save:&error])
    20. {
    21. NSLog(@"Datensatz %@ wurde gespeichert", newProfileName.text);
    22. masterViewController.choosenProfile.text = [NSString stringWithFormat:@"Chosen profile: %@", newProfileName.text];
    23. newProfileName.text = nil;
    24. [profilePicker reloadComponent:0];
    25. [profilePicker selectRow:[[[masterViewController.fetchedResultsController sections] objectAtIndex:0]numberOfObjects]
    26. inComponent:0 animated:YES];
    27. }
    28. else
    29. {
    30. NSLog(@"%@ konnte nicht gespeichert werden.", newProfileName.text);
    31. }
    Alles anzeigen



    ...und das der FRC im MasterViewController

    Quellcode

    1. - (NSFetchedResultsController *)fetchedResultsController
    2. {
    3. if (fetchedResultsController != nil) {
    4. return fetchedResultsController;
    5. }
    6. /*
    7. Set up the fetched results controller.
    8. */
    9. // Create the fetch request for the entity.
    10. NSFetchRequest *fetchRequest = [[NSFetchRequest alloc] init];
    11. // Edit the entity name as appropriate.
    12. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Usernames" inManagedObjectContext:managedObjectContext];
    13. // Edit the sort key as appropriate.
    14. NSSortDescriptor *sortDescriptor = [[NSSortDescriptor alloc] initWithKey:@"name" ascending:YES];
    15. NSArray *sortDescriptors = [[NSArray alloc] initWithObjects:sortDescriptor, nil];
    16. // Set the batch size to a suitable number.
    17. [fetchRequest setFetchBatchSize:20];
    18. [fetchRequest setEntity:entity];
    19. [fetchRequest setSortDescriptors:sortDescriptors];
    20. // Edit the section name key path and cache name if appropriate.
    21. // nil for section name key path means "no sections".
    22. NSFetchedResultsController *aFetchedResultsController = [[NSFetchedResultsController alloc] initWithFetchRequest:fetchRequest managedObjectContext:managedObjectContext sectionNameKeyPath:nil cacheName:@"Root"];
    23. aFetchedResultsController.delegate = self;
    24. self.fetchedResultsController = aFetchedResultsController;
    25. [aFetchedResultsController release];
    26. [fetchRequest release];
    27. [sortDescriptor release];
    28. [sortDescriptors release];
    29. return fetchedResultsController;
    30. }
    Alles anzeigen


    Ich hoffe Ihr könnt helfen das Problem zu beheben oder mir ein besseres Verständniss für das CoreDataProgramming zu vermitteln.

    Danke und besten Grüße

    Volker

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

  • OK, das mit dem versch(r)ieben hab' ich jetzt gecheckt... OMG, Ich hol mal direkt den Ventilator.

    Wat? Wie ?

    Ich steh auf'm Schlauch. Irgendwie ist es in meinem "Programmiererloch" zu warm um Dir zu folgen... :)
    Noch mal ganz langsam zum mitschreiben... Wo habe ich mich verschrieben.

    Gruß
  • Meint Ihr das so ?

    Quellcode

    1. NSLog(@"saveNewPictureSetName");
    2. if (masterViewController.fetchedResultsController != nil)
    3. {
    4. NSLog(@"FRC ist nicht gefüllt");
    5. NSError *error;
    6. [masterViewController.fetchedResultsController performFetch:&error];
    7. }
    8. NSManagedObjectContext *context = [self.username managedObjectContext];
    9. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Usernames"
    10. inManagedObjectContext:context];
    11. NSLog(@"Entityname = %@", [entity name]);
    12. username = [NSEntityDescription
    13. insertNewObjectForEntityForName:[entity name]
    14. inManagedObjectContext:context];
    15. [masterViewController unsetActivePhotoSet];
    16. [username setValue:[NSString stringWithFormat:@"%@", newProfileName.text] forKey:@"name"];
    17. [username setValue:[NSNumber numberWithInt:1] forKey:@"active"];
    18. NSError *error = nil;
    19. if ([context save:&error])
    20. {
    21. NSLog(@"Datensatz %@ wurde gespeichert", newProfileName.text);
    22. masterViewController.choosenProfile.text = [NSString stringWithFormat:@"Chosen profile: %@", newProfileName.text];
    23. newProfileName.text = nil;
    24. [profilePicker reloadComponent:0];
    25. [profilePicker selectRow:[[[masterViewController.fetchedResultsController sections] objectAtIndex:0]numberOfObjects]
    26. inComponent:0 animated:YES];
    27. }
    28. else
    29. {
    30. NSLog(@"%@ konnte nicht gespeichert werden.", newProfileName.text);
    31. }
    Alles anzeigen


    Das schmiert auch ab.

    Ich hatte es eigentlich vorher auf den MasterViewController zugeschnitten.

    Quellcode

    1. NSManagedObjectContext *context = [masterViewController.fetchedResultsController managedObjectContext];
    2. NSEntityDescription *entity = [masterViewController.fetchedResultsController.fetchRequest entity];

    Wenn ich es aber so mache, dann wird mir folgender Fehler ausgespuckt:

    Quellcode

    1. *** Terminating app due to uncaught exception 'NSInternalInconsistencyException', reason: '+entityForName: could not locate an NSManagedObjectModel for entity name '(null)''

    Das Entity existiert dabei merkwürdiger Weise nicht. Warum das so ist, würde ich gern verstehen.

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

  • Ich muss sagen, dass hier Fragen von Anfängern sehr schnell mit dem Griff zum Buch beantwortet werden, was ich persönlich sehr schade finde, denn ich würde nicht in einem Forum posten, wenn sich der Inhalt der Bücher, etc. als hilfreich oder verständlich erwiesen hätte. Sehr schade...
  • Quellcode

    1. NSManagedObjectContext *context = [self.username managedObjectContext];


    self.username wird sehr wahrscheinlich doch keine Methode managedObjectContext haben ?!?! Kenn ja den Code nicht.

    Log doch mal nacheinander was du für Objekte hast. Erstmal ob der Context stimmt, dann die Entiny etc. so kannst du das Problem vielleicht besser eingrenzen. Ich vermute dein Context ist nil, und da hängts dann. Eine Entity "Usernames" ist ja vorhanden.
    Seminare, Artikel, Code. ObjectiveCeeds - alles für die Apfelzucht.
  • Es liegt mit Sicherheit am Context. Die zuerst gepostete Version ist ein Test gewesen mit Code den ich dummerweise nicht zurückgebaut habe.

    Hier die eigentliche Version der Zeilen für Context und Entity:

    Quellcode

    1. NSManagedObjectContext *context = [masterViewController.fetchedResultsController managedObjectContext];
    2. NSEntityDescription *entity = [masterViewController.fetchedResultsController.fetchRequest entity];


    Wenn ich den Code so abfahre und versuche einen Benutzernamen zu speichern, zeigt er mir, dass das Entity NULL ist, und nicht im Context gefunden werden kann.

    Ändere ich wie folgt:

    Quellcode

    1. NSManagedObjectContext *context = [masterViewController.fetchedResultsController managedObjectContext];
    2. NSEntityDescription *entity = [NSEntityDescription entityForName:@"Usernames" inManagedObjectContext:context];

    bekomme ich den Hinweis, dass das Entity im Context nicht gefunden werden kann.

    Im selben Controller greife ich aber mit einen PickerView-Hooks auf den FRC vom MasterViewController zu. Der hat zwar noch keine Einträge zu liefern, schmiert aber auch bei der Benutzung nicht ab, oder wirft eine Exception.
  • Damoove schrieb:

    Ich muss sagen, dass hier Fragen von Anfängern sehr schnell mit dem Griff zum Buch beantwortet werden, was ich persönlich sehr schade finde, denn ich würde nicht in einem Forum posten, wenn sich der Inhalt der Bücher, etc. als hilfreich oder verständlich erwiesen hätte. Sehr schade...

    Das ist doppelt falsch.

    a) Ich sprach von Literatur.

    b) Mache ich das nur, wenn der Poster sich nicht selbst bemüht und konkrete Fragen stellt.
    Es hat noch nie etwas gefunzt. To tear down the Wall would be a Werror!
    25.06.2016: [Swift] gehört zu meinen *Favorite Tags* auf SO. In welcher Bedeutung von "favorite"?