06.11.2011
Einlesen und Schreiben von Property Listen (plist) mit Objective-C
Die plists sind eine Möglichkeit Konfigurationsdateien oder andere Daten auf dem Mac abzulegen. Mit Objective-C lassen sich diese sehr einfach in Datenstrukturen einlesen und wieder auf die Platte schreiben. Die plist-Dateien können als XML- oder Binärdateien vorliegen. Außerdem wird ein "old-style" ASCII-Format lesend unterstützt. Zum Öffnen von plists im Binärformat wird der plist-Editor benötigt, der mit Xcode installiert wird. Das XML- und ASCII-Format läßt sich mit jedem Texteditor öffnen.
So könnte eine plist-Datei aussehen, die Vokabeln enthält. Zwei Einträge sind einfach Key-Value-Paare bei denen der Value vom Type string
ist. Bei dem dritten Eintrag ist der Value vom Type array
und enthält zwei String-Werte.
<?xml version="1.0" encoding="UTF-8"?> <!DOCTYPE plist PUBLIC "-//Apple//DTD PLIST 1.0//EN" "http://www.apple.com/DTDs/PropertyList-1.0.dtd"> <plist version="1.0"> <dict> <key>milk</key> <string>Milch</string> <key>oats</key> <string>Hafer</string> <key>home</key> <array> <string>Heim</string> <string>Heimat</string> </array> </dict> </plist>
Da die Ansicht als XML-Datei schnell unleserlich wird, besteht die Möglichkeit sich die plist-Datei in einem eigenen plist-Viewer innerhalb von Xcode anzusehen. Wenn eine plist-Datei vom Finder aus geöffnet wird, dann öffnet sich der plist-Viewer automatisch.
Lesen von plists
Um so eine plist-Datei in ein NSDictionary
einzulesen, reichen folgende Befehle aus:
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Vokabeln" ofType:@"plist"]; NSDictionary *dic = [[NSDictionary alloc] initWithContentsOfFile:plistPath];
Es wird davon ausgegangen, daß die Datei innerhalb des Xcode-Projekts liegt und Vokabeln.plist
heißt.
Zur Kontrolle kann man das NSDictionary
folgendermaßen ausgeben:
// Ausgabe des NSDictionary id aKey; for (aKey in dic) { NSLog(@"%@ = %@", aKey, [dic objectForKey:aKey]); }
Schreiben von plists
Falls man plant die geladene plist-Datei zu ändern, kann man die Daten beim Laden in ein NSMutableDictionary
laden, damit das Ändern möglich ist.
In dem folgenden Beispiel wird eine plist-Datei in eine NSMutableDictionary
geladen und es wird ein Eintrag hinzugefügt. Danach wird die Datei unter einem anderen Namen wieder auf die Platte geschrieben.
NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Vokabeln" ofType:@"plist"]; NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath]; [dic setObject:@"Hund" forKey:@"dog"]; [dic writeToFile:[@"~/Documents/Vokabeln2.plist" stringByExpandingTildeInPath] atomically:TRUE];
Zu beachten ist, daß die Methode stringByExpandingTildeInPath
aufgerufen werden muß, falls der Pfad eine Tilde enthält.