Core Data Speicherung

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

  • Core Data Speicherung

    Guten Abend,
    ich habe eine kleine Verständnisfrage.

    Ich habe ein Array, dies soll mit Hilfe folgendem Codes gespeichert werden:

    Quellcode

    1. NSEntityDescription *speichern = [NSEntityDescription insertNewObjectForEntityForName:@"Woerter" inManagedObjectContext:self.managedObjectContext];
    2. NSError *error;
    3. BOOL isSaved;
    4. for (int i=0;i<self.stufe1.count ; i++)
    5. {
    6. isSaved = NO;
    7. [speichern setValue:self.stufe1[i] forKey:@"woerter"];
    8. isSaved = [self.managedObjectContext save:&error];
    9. NSLog(@"%d", isSaved);
    10. }
    Alles anzeigen


    Der Code speichert auch, leider nur den String des letzten Index!?
    Meine Frage ist: WARUM? Normal müsste er doch nun einzeln die Daten aus dem Array speichern oder nicht?

    P.S. Er gibt mir jedes Mal eine 1 aus. Als Zeichen, dass er es gespeichert hat.

    Gruß
    Hans der Pans
  • Hansepans schrieb:

    Normal müsste er doch nun einzeln die Daten aus dem Array speichern oder nicht?

    Tut er auch.

    Du erzeugst aber nur ein einziges NSManagedObject (nicht NSEntityDescription) und in der Schleife ersetzt Du das „woerter“ Attribut der Entity nacheinander mit allen Einträgen des Arrays. Am Ende bleibt natürlich nur das letzte Element über. Wenn Du mehrere Entitäten in Core Data speichern willst, dann musst du auch mehrere Entitäten erzeugen.

    Michael
  • Ok danke. Ich möchte nicht mehrere Entitäten ich möchte das Array speichern.
    Dachte vielleicht dass es so klappen könnte. Dann werde ich wohl das Array in Data umwandeln.

    Oder doch NSSet?!


    P.S. Ich habe das Array in NSData umgewandelt:

    NSData *dataarray = [NSKeyedArchiver archivedDataWithRootObject: self.stufe1];
    NSEntityDescription *speichern = [NSEntityDescription insertNewObjectForEntityForName:@"Woerter" inManagedObjectContext:self.managedObjectContext];
    NSError *error;
    BOOL isSaved;
    [speichern setValue:dataarray forKey:@"woerter"];
    isSaved = [self.managedObjectContext save:&error];
    NSLog(@"%d", isSaved);

    Das scheint auch ohne weiteres zu funktionieren. (Ich habe den Attributetyp auf Transformatable)

    Das Auslesen funktioniert leider nicht:

    NSEntityDescription *speicher = [NSEntityDescription entityForName:@"Woerter" inManagedObjectContext:self.managedObjectContext];
    NSFetchRequest *fetch = [[NSFetchRequest alloc]init];
    [fetch setEntity:speicher];
    NSMutableArray *array = [[self.managedObjectContext executeFetchRequest:fetch error:nil] mutableCopy];
    NSData *dataarray;
    for(NSManagedObject *obj in array)
    {
    dataarray = [array valueForKey:@"woerter"];
    }

    self.stufe1 = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:dataarray]];

    Bei self.stufe1 = [NSMutableArray arrayWithArray:[NSKeyedUnarchiver unarchiveObjectWithData:dataarray]]; bricht er das Programm ab mit folgender Fehlermeldung:

    2013-05-09 13:01:33.569 bla[1243:c07] -[__NSArrayI bytes]: unrecognized selector sent to instance 0x749ec10
    2013-05-09 13:01:33.571 bla[1243:c07] *** Terminating app due to uncaught exception 'NSInvalidArgumentException', reason: '-[__NSArrayI bytes]: unrecognized selector sent to instance 0x749ec10'
    *** First throw call stack:
    (0x15c4012 0x13e9e7e 0x164f4bd 0x15b3bbc 0x15b394e 0x154c390 0xe186bf 0xe56c17 0x2cab 0x32b157 0x32b747 0x32c94b 0x33dcb5 0x33ebeb 0x330698 0x2411df9 0x2411ad0 0x1539bf5 0x1539962 0x156abb6 0x1569f44 0x1569e1b 0x32c17a 0x32dffc 0x280d 0x2735 0x1)
    libc++abi.dylib: terminate called throwing an exception
    (lldb)

    Ich versuche schon sehr lange eine Lösung zu finden. Leider ohne Erfolg. Im Cocoa Buch I von Amin steht ab Seite 635 etwas über transformierbare Attributetypen. Da wird auch geschrieben, dass wenn man das Feld "Value Transformier Name" leer gelassen wird, der NSKeyedUnarchiver schon aufgerufen.

    Ich habe mir das dataarray auch schon direkt ausgeben lassen. Natürlich kamen da nur lauter Zahlen raus und kein gespeicherter Wert.

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