Daten in Plist schreiben

Diese Seite verwendet Cookies. Durch die Nutzung unserer Seite erklären Sie sich damit einverstanden, dass wir Cookies setzen. Weitere Informationen

  • Daten in Plist schreiben

    Hallo,
    Ich möchte Daten in eine Plist schreiben. Allerdings klappt das nicht so ganz. Hier mein Code:

    Quellcode

    1. ​- (IBAction)addButtonTouchDown:(id)sender
    2. {
    3. NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
    4. NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
    5. [dic setObject:self.nameTextBox.text forKey:@"Names"];
    6. [dic setObject:self.numberTextBox.text forKey:@"Phones"];
    7. [dic writeToFile:@"Data.plist" atomically:YES];
    8. }


    Ich kann einfach keinen Fehler finden. Hab ich irgentwas wichtiges Vergessen? Theoretisch müsste das doch so klappen.

    Viele Grüße
    Florian
  • writeToFile:atomically: sollte ins aktuelle Verzeichnis schreiben, wenn man nur einen Namen und keine Pfad übergibt. Unter OS X und iOS dürfte das aktuelle Verzeichnis jedoch selten Schreibrechte haben.

    Das aktuelle Verzeichnis kannst Du Dir z.B. mit:

    Quellcode

    1. NSLog(@"currentDirectoryPath:%@",[[NSFileManager defaultManager] currentDirectoryPath]);

    ausgeben lassen.

    Versuche mal an writeToFile:atomically: einen kompletten Pfad mit Schreibrechten für das Verzeichnis zu übergeben.

    BTW: Geht es hier um OS X oder iOS?
  • / ist das Root-Verzeichnis. Da hast Du unter iOS garantiert keine Schreibrechte. ;)

    Quellcode

    1. [dic writeToFile:@"Data.plist" atomically:YES];

    enthält auch keine Pfad sondern nur einen Dateinamen. Also versucht writeToFile:atomically: die Datei unter /Data.plist, also im Root-Verzeichnis, zu speichern, was natürlich nicht möglich ist (s.o.).

    Unter iOS kann man nur innerhalb des eigenen Bundles und in dafür vorgesehen Verzeichnisse schreiben.

    Schau Dir dazu mal den File System Programming Guide an. Dort ist genau beschrieben, welches das ideale Verzeichnis wäre.
  • CommanderFlausch schrieb:

    Okay, jetzt ist die frage wie ändere ich das Verzeichnis der Plist bzw. wie bekomme ich schreibrechte. Vielleicht habe ich an den Falschen stellen gesucht, aber in dem link zum File System Programming Guide konnte ich nichts dazu finden.


    Es hat schon seinen Grund warum man nicht an jeden Ort hinschreiben darf wie es einem beliebt. Wie schon gesagt wurde gibt es klar definierte Orte wo du Daten deiner App speichern darfst. Nutze diese, sie stehen in dem verlinkten Guide sicher drin, z.B. aufgelistet in Table 1-1 Commonly used directories of an iOS app ;)
    [self setSignature:null];
    [[self postCount] increment];
  • Ich habe jetzt den gesamten Pfad angegeben, aber es Funktioniert leider immer noch nicht.

    Quellcode

    1. ​ NSString* plistPath = [[NSBundle mainBundle] pathForResource:@"Data" ofType:@"plist"];
    2. NSMutableDictionary *dic = [[NSMutableDictionary alloc] initWithContentsOfFile:plistPath];
    3. [dic setObject:self.nameTextBox.text forKey:@"Names"];
    4. [dic setObject:self.numberTextBox.text forKey:@"Phones"];
    5. [dic writeToFile:plistPath atomically:YES];
  • CommanderFlausch schrieb:

    Vielleicht habe ich an den Falschen stellen gesucht, aber in dem link zum File System Programming Guide konnte ich nichts dazu finden.

    Sieht mir ganz so aus. Schau mal unter File System Basics und dort unter dem Punkt "About the iOS File System" > "iOS Standard Directories: Where Files Reside".

    Unter "Accessing Files and Directories" > "Locating Items in the Standard Directories" ist dann inkl. Sample Code beschrieben, wie man z.B. die URL zum NSApplicationSupportDirectory erhält.
  • Okay, das der Ort wo sich die Plist aktuell befindet ungeeignet ist, hab eich verstanden. Aber wie bekomme ich sie in das z.b. Dokuments Verzeichnis der App? Ich erstelle die Plist mit Xcode, als Resource. Dann wird sie mir automatisch ins Bundle der App geschoben. Hab ich irgend eine Einstellung übersehen, oder was grundlegendes Falsch verstanden?
  • Ändere einfach die Art, wie Du die plist lädst und speichere sie immer in das passende Verzeichnis z.B. das Application Support Verzeichnis.

    Beim Laden prüfst Du zuerst ob es die plist z.B. im Application Support Verzeichnis gibt. Gibt es dort die gewünschte Datei, dann lädst Du sie aus diesem Verzeichnis. Ist die Datei dort nicht vorhanden, dann lädst Du die "Default" Datei aus dem App Bundle.