写入mainBundle plist

时间:2013-06-03 21:04:05

标签: ios objective-c plist nsdictionary

我有一个问题,我创造了一个电影的plist。 Root是Dictionary类型 和皮克斯类型数组  有3个字符串的电影片名 我能够从列表中读取以下代码没有问题

NSString *path = [[NSBundle mainBundle] pathForResource:@"Movies" ofType:@"plist"];

NSMutableDictionary *movies =[[NSMutableDictionary alloc] initWithContentsOfFile:path];
从这里我可以打印列表没问题。 我现在要在此列表中添加另一部电影。 所以我将列表转移到一个数组,然后将数组保存回文件,但它无法正常工作。 我知道哪里出错了?

NSMutableArray *array= [movies valueForKey:@"Pixar"];
NSString *incredible=@"Incredibles";
[array addObject:incredible];

[movies setObject:array forKey:@"Pixar"];

[movies writeToFile:path atomically:YES];

1 个答案:

答案 0 :(得分:3)

您无法在设备上写入捆绑包。模拟器不会强制执行这些约束,但设备会。

一种方法是:

  1. 查看该文件是否存在于Documents文件夹中。

  2. 如果是,请从Documents文件夹中读取。如果没有,请从捆绑中读取。

  3. 完成添加/删除记录后,将文件写入Documents文件夹。

  4. 因此:

    NSString *bundlePath    = [[NSBundle mainBundle] pathForResource:@"Movies" ofType:@"plist"];
    NSString *docsFolder    = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES)[0];
    NSString *documentsPath = [docsFolder stringByAppendingPathComponent:@"Movies.plist"];
    
    NSMutableDictionary *movies = nil;
    
    if ([[NSFileManager defaultManager] fileExistsAtPath:documentsPath])
        movies = [NSMutableDictionary dictionaryWithContentsOfFile:documentsPath];
    
    if (!movies)
        movies = [NSMutableDictionary dictionaryWithContentsOfFile:bundlePath];
    
    // do whatever edits you want
    
    [movies writeToFile:documentsPath atomically:YES];