1
Root ---- Array 
    Item 0- Dictionary 
    fullName ---- String 
    address ---- String 
    Item 1 ---- Dictionary 
    fullName ---- String 
    address ---- String 

Ich habe die folgende plist Struktur.Wie UPDATE und löschen String-Elemente und ganze Wörterbuch-Elemente aus einem Plist

Q1 Wie aktualisiere/ändere ich FullName im Code, nachdem er bereits in der PLIST-Datei gespeichert wurde?

Q2 Wie lösche ich nur ein Dictionary-Element im obigen Beispiel Item 0?

Ich verwende den Navigationscontroller TableView mit dem Detailbeispiel.

Dank

+0

Danke für die Korrektur meiner Formatierung. Ich lese "Code und vorformatierter Text", während wir sprechen. –

Antwort

4

Sie haben nicht wirklich etwas Form der plist-Datei aktualisieren oder löschen. Es ist ein bisschen mehr beteiligt als das:

  1. Lesen Sie die plist-Datei in dem Speicher
  2. Alter die In-Memory-Version
  3. die neue Version auf der Festplatte

Lesung in einer plist schreiben zurück ist ziemlich trivial. In Ihrem Fall, da das Wurzelelement ein Array ist, dann würden Sie tun:

NSMutableArray * plistContents = [NSMutableArray arrayWithContentsOfFile:plistFilePath]; 

Hier haben wir einen änderbaren Array zu erstellen, da wir wissen, wir gehen Sachen drin zu ändern. Wenn wir nur die Informationen lesen wollten, sollten wir NSArray anstelle von NSMutableArray verwenden.

Ändern der In-Memory-Version als Manipulation Standardcontainer ist so einfach:

//delete the first dictionary: 
[plistContents removeObjectAtIndex:0]; 

//Change a dictionary's full name: 
NSMutableDictionary * firstDictionary = [[plistContents objectsAtIndex:0] mutableCopy]; 
[firstDictionary setObject:@"Mike" forKey:@"fullName"]; 
[plistContents replaceObjectAtIndex:0 withObject:firstDictionary]; 
[firstDictionary release]; 

Hier müssen wir eine veränderbare (änderbar) Kopie des Wörterbuchs machen, denn nur in einer plist Lesen erzeugt die unveränderliche NSDictionary . Wir kopieren also das Wörterbuch, ändern den Wert, den wir ändern wollen, und ersetzen das ursprüngliche Wörterbuch durch unser neues modifiziertes Wörterbuch.

Schreiben der plist auf die Festplatte ist auch einfach:

//be sure you have write-permissions first! 
[plistContents writeToFile:plistFilePath atomically:YES]; 
+0

Danke Dave. Ich werde es morgen versuchen, es ist 4 Uhr EST und ich bin sicher, dass die Kinder mich um 6 Uhr aufwecken werden. Ihre Informationen sind sehr informativ und gut durchdacht. –

+0

Ich legte [plistContents writeToFile: plistFilePath atomarly: YES]; in meinem ViewDidDisappear und es funktioniert super. Vielen Dank. Jetzt muss ich nur das Update zum Laufen bringen. Das Update passiert in der Detailansicht, aber mit dem, was du mir gegeben hast, denke ich, dass ich es herausfinden kann. –

1

Sie arbeiten nicht auf die in einer plist gespeicherten Daten direkt, Sie serialisiert Objekte oder unserialize Objekte aus einer plist. Da Sie die Daten ändern möchten, müssen Sie die Zuordnung zu veränderbaren Objekten aufheben. NSPropertyListSerialization 's propertyListWithData:options:format:error: unserserialize eine plist erstellen veränderbare Sammlungen, wenn Sie die NSPropertyListMutableContainers oder NSPropertyListMutableContainersAndLeaves Option verwenden.

NSError *err=nil; 
NSData *raw = [[NSData alloc] initWithContentsOfFile:path]; 
id stuff = [NSPropertyListSerialization 
        propertyListWithData:raw 
           options:NSPropertyListMutableContainers 
           format:NULL 
            error:&err; 
     ]; 
if (err) { 
    // couldn't parse the plist; handle the error. 
    ... 
    [err release]; 
} 
[raw release]; 

Dies wird Ihnen eine verschachtelte Sammlung von NSMutableArray s erhalten, NSMutableDictionary s, entweder NSString s oder NSMutableString s (je nachdem, ob Sie NSPropertyListMutableContainers angegeben oder NSPropertyListMutableContainersAndLeaves) & c. Nachdem Sie die PLL-Datei deserialisiert haben, verwenden Sie die von der Sammlung zur Verfügung gestellte Methode, um z. B. die Elemente zu entfernen (z. B. , removeObjectForKey:) oder zu setzen (z. B.).

Weitere Informationen finden Sie in der Property List Programming Guide.

+0

+1 für die Verwendung der Option für veränderbare Container. Ich erinnere mich nie, dass das existiert :) –