简体   繁体   中英

writing NSArray back to plist

I have a plist with the following format:

在此输入图像描述

And here's how I read it:

NSString *errorDesc = nil;
    NSPropertyListFormat format;

    NSString *path = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];    
    NSData  *plistXML = [[NSFileManager defaultManager] contentsAtPath:path];
    NSDictionary *temp = (NSDictionary *)[NSPropertyListSerialization                     
                                          propertyListFromData:plistXML
                                          mutabilityOption:NSPropertyListMutableContainersAndLeaves
                                          format:&format
                                          errorDescription:&errorDesc];

    self.statesData = [temp objectForKey:@"Root"];

The question is if I want to write this NSMutableArray called self.statesData back to the plist, how would I do it? I am guessing something like this wouldn't work...

 NSString *path = [[NSBundle mainBundle] pathForResource:@"States" ofType:@"plist"];  
    [self.main.statesData writeToFile:path atomically: YES];

You can not write the app's bundle, you need to write to the app's Document directory.

Sample code:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *filePath = [documentsDirectory stringByAppendingPathComponent:fileName];

BOOL status = [array writeToFile:filePath atomically:YES];

If you have initial dad in the app bundle on first run copy it to the Documents directory and make all further accesses to the Documents directory.

On iOS, you can't write to files in your app wrapper (and on MacOS X, you really shouldn't). What you need to do is first copy to the Documents folder from the app wrapper, then load and save to that version.

Getting the Documents folder:

NSString *filePath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
;
filePath = [filePath stringByAppendingPathComponent:@"States.plist"];
[self.statesData writeToFile:path atomically:YES];

Loading the file from the app wrapper you are already doing; copying can be done readily using NSFileManager . You can reconstitute the temp array and replace the key from your statesData before saving. An alternate read command might be:

self.statesData = [NSArray arrayWithContentsOfFile:filePath];

SWIFT version of @zaph's code above:

let paths = NSSearchPathForDirectoriesInDomains(NSSearchPathDirectory.DocumentDirectory, NSSearchPathDomainMask.UserDomainMask, true)
let documentsDirectory = paths[0]
let filePath = NSURL(fileURLWithPath: documentsDirectory, isDirectory: true).URLByAppendingPathComponent(fileName)
let status = items.writeToFile(filePath.absoluteString, atomically: true)

The technical post webpages of this site follow the CC BY-SA 4.0 protocol. If you need to reprint, please indicate the site URL or the original address.Any question please contact:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM