2009-09-28 22 views
21

Vorrei salvare un NSArray come file o eventualmente utilizzare i valori predefiniti dell'utente. Ecco cosa spero di fare.Salvataggio di un NSArray

  1. Recupera già NSArray salvato (se presente).
  2. Fai qualcosa con esso.
  3. Cancella i dati salvati (se presenti).
  4. Salva il NSArray.

È possibile, e se sì, come dovrei farlo?

risposta

38

NSArray fornisce due metodi per fare esattamente quello che vuoi: initWithContentsOfFile: e writeToFile:atomically:

Un breve esempio potrebbe essere simile a questo:

//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

Grazie! Una domanda sarà 'writeToFile:' creare un nuovo file con l'array in sul percorso specificato? – Joshua

+1

Sì. Un avvertimento: la matrice deve essere un elenco di proprietà valido, il che significa che tutti i suoi contenuti (e il loro contenuto, se del caso) devono anche essere elenchi di proprietà. –

+0

Vedo, dovrebbe essere ok. Quindi, quando carico la matrice con 'initWithContentsOfFile:' devo dare il percorso direttamente al file e, in caso affermativo, come sarà chiamato? – Joshua

1

Questo sembra essere un problema più adatto per i dati di base in quanto si occuperà di tutti i dati persistenti dell'oggetto. Quando si recuperano i dati, viene restituito un NSSet, che non è ordinato, quindi è necessario disporre di un modo per ordinare i dati nell'array, ad esempio un numero identificativo univoco associato a ciascun oggetto creato.

13

Si potrebbe implementare NSCoding sugli oggetti l'array contiene e utilizzare NSKeyedArchiver per serializzare/deserializzare l'array su disco.

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

L'Archiver rinvierà al vostro implementazione NSCoding per ottenere i valori serializzabili da ogni oggetto e scrivere un file che può essere letto con NSKeyedUnarchiver:

id myArray = [NSKeyedUnarchiver unarchiveObjectWithFile:path]; 

Maggiori informazioni nel serialization guide.

+1

Sì. Volevo aggiungere che in questo modo deve essere utilizzato se la matrice contiene dati non di proprietà PropertyList (vedere la risposta di Racha per i dati di proprietà di PropertyList). –