2009-09-28 9 views
21

Me gustaría guardar un NSArray como archivo o posiblemente utilizar los valores predeterminados del usuario. Esto es lo que espero hacer.Guardar un NSArray

  1. Recupere ya NSArray guardado (si lo hay).
  2. Haz algo con él.
  3. Borrar los datos guardados (si los hay).
  4. Guarde el NSArray.

Esto es posible, y si es así, ¿cómo debo hacer esto?

Respuesta

38

NSArray le proporciona dos métodos para hacer exactamente lo que quiere: initWithContentsOfFile: y writeToFile:atomically:

Un ejemplo corto podría tener este aspecto:

//Creating a file path under iOS: 
//1) Search for the app's documents directory (copy+paste from Documentation) 
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
NSString *documentsDirectory = [paths objectAtIndex:0]; 
//2) Create the full file path by appending the desired file name 
NSString *yourArrayFileName = [documentsDirectory stringByAppendingPathComponent:@"example.dat"]; 

//Load the array 
NSMutableArray *yourArray = [[NSMutableArray alloc] initWithContentsOfFile: yourArrayFileName]; 
if(yourArray == nil) 
{ 
    //Array file didn't exist... create a new one 
    yourArray = [[NSMutableArray alloc] initWithCapacity:10]; 

    //Fill with default values 
} 
... 
//Use the content 
... 
//Save the array 
[yourArray writeToFile:yourArrayFileName atomically:YES]; 
+0

Gracias! Una pregunta será 'writeToFile:' crear un nuevo archivo con la matriz en la ruta especificada? – Joshua

+1

Sí. Una advertencia: la matriz debe ser una lista de propiedades válida, lo que significa que todos sus contenidos (y sus contenidos, cuando corresponda) también deben ser listas de propiedades. –

+0

Veo, eso debería estar bien. Entonces, cuando cargo la matriz con 'initWithContentsOfFile:' ¿tengo que dar la ruta directamente al archivo y, de ser así, cómo se llamará? – Joshua

1

Esto parece ser un problema más adecuado para Core Data, ya que se ocupará de todos los datos persistentes del objeto. Cuando recupere sus datos, devolverá un NSSet, que no está ordenado, por lo que tendrá que ordenar de algún modo los datos en la matriz, como un número único de id. Asociado con cada objeto que cree.

13

Se podría aplicar NSCoding en los objetos de la matriz contiene y use NSKeyedArchiver para serializar/deserializar su matriz al disco.

BOOL result = [NSKeyedArchiver archiveRootObject:myArray toFile:path]; 

El archivador aplazará a su aplicación NSCoding para obtener valores serializables de cada objeto y escribir un archivo que se puede leer con NSKeyedUnarchiver:

id myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

Más información en la serialization guide.

+1

Sí. Quería agregar que debe usarse de esta manera si la matriz contiene datos amigables que no son PropertyList (vea la respuesta de Racha para los datos amigables de PropertyList). –