Pregunta

Bueno, por supuesto que es posible, eso no es problema. En mi código que tengo varios objetos con los que trabajo, y tienen que ser los datos persistentes. Para ello he utilizado la codificación de objetos y almacenarlos en un archivo de datos. Tales como:

-(NSString *)dataFilePath
{
    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
    NSString *documentsDirectory = [paths objectAtIndex:0];
    return [documentsDirectory stringByAppendingPathComponent:kFilename];
}

Y luego más adelante en otra sección de código:

NSMutableData *data = [[NSMutableData alloc] init];
        NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
        NSLog(@"Test 4");
        [archiver encodeObject:playerTwo forKey:@"PlayerTwoObject"];
        [archiver encodeObject:singlePlayer forKey:@"SinglePlayer"];
        [archiver encodeObject:playerOne forKey:@"PlayerOneObject"];
        [archiver encodeObject:settings forKey:@"Settings"];


        [archiver finishEncoding];
        [data writeToFile:[self dataFilePath] atomically:YES];
        [singlePlayer release];
        [playerOne release];
        [playerTwo release];
        [settings release]; 

Y que guarda los objetos. Yo sé que funciona, porque puedo llevarlos a cabo con este código:

unarchiver = [[NSKeyedUnarchiver alloc] initForReadingWithData:[[NSMutableData alloc] initWithContentsOfFile:[self dataFilePath]]];
    SettingsObject *settings = [unarchiver decodeObjectForKey:@"Settings"];
    Player *test = [unarchiver decodeObjectForKey:@"PlayerOneObject"];
    NSLog(@"Power On Settings Test: %d,%d", [settings playerOneStartingLife], [settings singlePlayerStartingLife]);
    NSLog(@"Power On Player Test: %@,%d", [test name], [test life]);

Cool! Así que ahora puedo guardar mis objetos, y leerlos. Así que aquí es donde el problema viene en. En una clase diferente saco uno de los objetos que estoy almacenando y trabajar con él. No todos ellos, sólo leí a uno. Y luego lo guardo de nuevo después de cambiar la configuración. Pero sólo guardarlo:

NSMutableData *data = [[NSMutableData alloc] init];
    NSKeyedArchiver *archiver = [[NSKeyedArchiver alloc] initForWritingWithMutableData:data];
    [archiver encodeObject:singlePlayer forKey:@"SinglePlayer"];
    [archiver finishEncoding];
    [data writeToFile:[self dataFilePath] atomically:YES];
    [singlePlayer release];

Después de que he hecho eso, todo el resto de los objetos que he almacenado se eliminan. Ahora estoy confundido, porque pensaba que sólo estaba editando la tecla "SinglePlayer", pero al parecer que de alguna manera quita el resto de ellos? Es que supossed a pasar? He tenido algunos problemas con la liberación del archivador, afectaría eso en absoluto ... no creo que lo haría. ¿Alguien tiene una idea de esto, porque no quiero tener que tomar todos los objetos y volver a codificar si sólo quiero editar uno de ellos ...

Gracias por su ayuda!

¿Fue útil?

Solución

crear un nuevo archivador, con un objeto de datos emtpy. Se escribe el objeto SinglePlayer en los datos, pero no almacena el resto de los datos en el mismo archivo, de nueva creación.

Para ello, retira todo el archivo previamente almacenado, y luego ajustar el objeto SinglePlayer y archivar y guardar de nuevo.

Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top