2009-10-19 26 views
5

Nella mia app per iPhone, ho due file plist per memorizzare "Temi". Uno è un file di sola lettura contenente temi predefiniti e uno contiene temi personalizzati creati dall'utente. Sto usando i file plist perché è molto facile per me leggere dal plist e creare nuovi oggetti Theme.Come si aggiunge un nuovo articolo a un plist?

Il mio plist è un array di oggetti dizionario.

C'è un modo semplice per aggiungere un nuovo oggetto dizionario al mio file plist? O devo leggere il file in memoria, aggiungere il nuovo oggetto del dizionario e scriverlo nel filesystem?

Grazie!

+0

Questo è il modo semplice. Che altro speri? –

+1

Ho scavato attraverso i documenti per vedere se mi mancava qualcosa, come i metodi di convenienza per modificare i plists, dal momento che sono molto usati nelle applicazioni Cocoa. Indovina non :) –

risposta

5

Con Cocoa, è necessario leggere il file in memoria, aggiungere il nuovo oggetto dizionario e scriverlo di nuovo nel file system. Se si utilizza un plist XML, si potrebbe facilmente analizzarlo e scrivere in modo incrementale sul file, ma sarebbe anche un po 'più grande, quindi è improbabile che ne varrà la pena.

Se la riscrittura del plist sta richiedendo troppo tempo, è necessario esaminare l'utilizzo di un database invece (forse tramite dati di base). A meno che il file non sia enorme, dubito che questo sarà un problema anche con la capacità di memoria dell'iPhone e la velocità di scrittura del flash.

+0

Che farà! Grazie. –

+0

Ricorda che non è possibile scrivere nel pacchetto dell'app. Devi trovare la directory dei documenti della tua app (usa 'NSSearchPathForDirectoriesInDomain()') e scrivila lì. –

3

(ho copiato questo per coloro che non vogliono fare clic su un collegamento da una domanda simile ho risposto qui: A question on how to Get data from plist & how should it be layout)

Qui ci sono due metodi per leggere e scrivere i valori da un plist utilizzando un NSDictionary:

- (NSMutableDictionary*)dictionaryFromPlist { 
    NSString *filePath = @"myPlist.plist"; 
    NSMutableDictionary* propertyListValues = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 
    return [propertyListValues autorelease]; 
} 

- (BOOL)writeDictionaryToPlist:(NSDictionary*)plistDict{ 
    NSString *filePath = @"myPlist.plist"; 
    BOOL result = [plistDict writeToFile:filePath atomically:YES]; 
    return result; 
} 

e poi nel blocco di codice da qualche parte:

// Read key from plist dictionary 
NSDictionary *dict = [self dictionaryFromPlist]; 
NSString *valueToPrint = [dict objectForKey:@"Executable file"]; 
NSLog(@"valueToPrint: %@", valueToPrint); 

// Write key to plist dictionary 
NSString *key = @"Icon File"; 
NSString *value = @"appIcon.png"; 
[dict setValue:value forKey:key]; 

// Write new plist to file using dictionary 
[self writeDictionaryToPlist:dict]; 
3

Questo è come mi sto allegando i dati alla plist:

NSString *filePath = [self dataFilePath]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
{ 
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 
    [array addObject:countdownLabel.text]; 
    [array writeToFile:[self dataFilePath] atomically:YES]; 
    [array release]; 
} 
else 
{ 
    NSArray *array = [NSArray arrayWithObject:countdownLabel.text]; 
    [array writeToFile:filePath atomically:YES]; 
} 
Problemi correlati