viernes, 13 de abril de 2012

Modificación de property list en iOS

Las property list se guardan en el bundle de la aplicación, que es un directorio con una estructura jerárquica estandarizada que contiene el código ejecutable y los recursos utilizados por ese código. El bundle de la aplicación se firma, luego no se puede modificar una vez firmado. Por lo tanto, a ese directorio solo se tiene acceso de lectura desde la aplicación.

Pero, ¿que pasa si necesitamos modificar una property list?. Supongamos que nuestra aplicación carga un TableView con los valores de una property list y queremos permitir al usuario añadir nuevas filas a esa tabla que se almacenarán en la property list. Pues entonces lo que deberemos hacer primero es copiar la plist al directorio Documents. Este directorio está dentro del sandbox de la aplicación y se tiene acceso de lectura y escritura a los ficheros que se encuentren allí. La copia la podemos hacer la primera vez que se lance la app, por ejemplo en el viewDidLoad. Para evitar machacar los ficheros modificados en posteriores arranques, comprobaremos primero si ya existe. A continuación os muestro una forma de hacerlo:

- (void)copyPropertyLists:(NSString *)propertyListName
{
// Recuperamos la ruta del plist que queremos copiar
    NSString *pListFile = [[NSBundle mainBundle] pathForResource:propertyListName ofType:@"plist"];
    
    if (![[NSFileManager defaultManager] fileExistsAtPath:pListFile]) 
    {
        NSLog(@"El fichero no existe");
    }
    else
    {
// Obtenemos la ruta del directorio Document de nuestra aplicación
        NSString *documentFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];
        
// Completamos la ruta con el nombre del nuevo fichero
        NSString *newDoseUnitsPlistFile = [documentFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%@", propertyListName, @".plist"]];
// Comprobamos si ya existe y, si no es así, hacemos la copia
        NSFileManager *fileManager = [NSFileManager defaultManager];
        if(![fileManager fileExistsAtPath:newDoseUnitsPlistFile])
        {
            [[NSFileManager defaultManager]copyItemAtPath:pListFile toPath:newDoseUnitsPlistFile error:nil];
        }
    }    
}

Y ahora ya podemos modificar la plist. Si, por ejemplo, fuese un array de strings: 



- (void)addString:(NSString *)data toPropertyList:(NSString *)propertyListName
{
    NSString *documentFolder = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) objectAtIndex:0];

    NSString *pListPath = [documentFolder stringByAppendingPathComponent:[NSString stringWithFormat:@"%@%@", propertyListName, @".plist"]];
    
    if (![[NSFileManager defaultManager] fileExistsAtPath:pListPath]) 
    {
        NSLog(@"El fichero no existe");
    }
    
// Leemos los objetos que almacena actualmente. Necesitamos que sea mutable ya que lo vamos a modificar añadiendo un nuevo elemento.
    NSMutableArray *addData = [NSMutableArray arrayWithContentsOfFile:pListPath];
// Añadimos el nuevo
    [addData addObject:data];
// Y volcamos al fichero
    [addData writeToFile:pListPath atomically:YES];
}



Espero que os sirva de ayuda.

No hay comentarios:

Publicar un comentario