2010-06-09 25 views
19

Ich versuche, ein Array, das einige Wörterbücher enthält, in eine PLIST-Datei zu speichern, aber es schlägt fehl. Ich bekomme keine Fehler. Ich mache genau die gleichen Zeilen oben im Code nur mit einem anderen Array und das funktioniert .. Ich kann nicht herausfinden, warum es die Datei nicht speichert.NSArray writeToFile schlägt fehl

Dies ist, wo ich die Datei zu speichern: (einige Debugger Ausgabe siehe unten)

// When built parse through dictionary and save to file 
    for (NSString *keys in [dicByCountry allKeys]) 
    { 
     NSArray *arrr = [[NSArray alloc] initWithArray:[dicByCountry objectForKey:keys]]; 
     NSString *fname = [self filePath:[NSString stringWithFormat:@"regions.cid%@.plist",keys]]; 
     if (![arrr writeToFile:fname atomically:YES]) 
      NSLog(@"Could not write file regions.cid%@.plist",keys); 
    } 

Hier einige GDB Output

(gdb) po fname 
/Users/chris/Library/Application Support/iPhone Simulator/4.0/Applications/44A9FF9E-5715-4BF0-9BE2-525883281420/Documents/regions.cid0.plist 


(gdb) po arrr 
<__NSArrayI 0x8022b30>(
{ 
    countryID = "<null>"; 
    region = "?\U00e2vora"; 
    regionID = 16; 
}, 
{ 
    countryID = "<null>"; 
    region = Vicenza; 
    regionID = 14; 
}, 
{ 
    countryID = "<null>"; 
    region = Wales; 
    regionID = 23; 
} 
) 

Antwort

33

Wenn Sie the documentation genau lesen, erwartet writeToFile:atomically: das Array nur enthalten Objekte, die in eine Plist-Datei geschrieben werden können.

nur Objekte vom Typ:

  • NSString
  • NSData
  • NSDate
  • NSNumber
  • NSArray
  • NSDictionary

sind zulässig. Wenn Arrays oder Wörterbücher in dem Array gespeichert sind, das Sie speichern, werden ihre Werte anhand derselben Kriterien überprüft.

Dies ist etwas restriktiver als was normalerweise in NSArray s erlaubt ist. Insbesondere ist der Wert [NSNull null] nicht akzeptabel.

+0

Dank das war das Problem. – Chris

+1

Was ist mit NSNummer? Was ist mit Null? –

+0

Arrays können nicht 'nil' enthalten und die Dokumentation zeigt nicht an, dass 'NSNumber' als Eigenschaftenlistenwerte gültig sind. – warrenm

27

Ich konvertiere NSArray oder NSDictionary in NSData vor der Serialisierung. Es folgt eine Kategorie in nsarray zum Serialisieren und Deserialisieren. Dieses comfortableby handhabt einige Daten, die nsnull sind

@implementation NSArray(Plist) 

-(BOOL)writeToPlistFile:(NSString*)filename{ 
    NSData * data = [NSKeyedArchiver archivedDataWithRootObject:self]; 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * documentsDirectory = [paths objectAtIndex:0]; 
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename]; 
    BOOL didWriteSuccessfull = [data writeToFile:path atomically:YES]; 
    return didWriteSuccessfull; 
} 

+(NSArray*)readFromPlistFile:(NSString*)filename{ 
    NSArray * paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString * documentsDirectory = [paths objectAtIndex:0]; 
    NSString * path = [documentsDirectory stringByAppendingPathComponent:filename]; 
    NSData * data = [NSData dataWithContentsOfFile:path]; 
    return [NSKeyedUnarchiver unarchiveObjectWithData:data]; 
} 

@end //needs to be set for implementation 
+0

Ich habe diesen Code auf NSDictionary verwendet, und es hat super funktioniert. Vielen Dank! – Nathan

+0

Code funktioniert wie ein Chef! – DAS

+0

Das funktioniert wunderbar, und es ist wirklich einfach, für 'NSDictionary' zu tweaken ... – Nick