【问题标题】:write a dictionary to plist on iphone写字典到 iPhone 上的 plist
【发布时间】:2011-09-28 05:24:06
【问题描述】:

我想在现有的 plist 文件中添加一个新字典,我该怎么做,我可以从文件中读取,但是使用相同的方法,写入不起作用。我的 plist 结构如下所示:

Root         Array
  |__item0   Dictionary
  |__item1   Dictionary
  |__item2   Dictionary

写入文件的代码如下:

NSFileManager *fileManager = [NSFileManager defaultManager];
NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
NSString *plistPath = [documentDirectory stringByAppendingPathComponent:@"list.plist"];

if (![fileManager fileExistsAtPath:plistPath]) {
    plistPath = [[NSBundle mainBundle] pathForResource:@"list" ofType:@"plist"];
}

NSMutableArray *dataRoot = [NSMutableArray arrayWithContentsOfFile:plistPath];

NSMutableDictionary *item = [[NSMutableDictionary alloc] init];
[item setObject:@"value1" forKey:@"1"];
[item setObject:@"value2" forKey:@"2"];
[item setObject:@"value3" forKey:@"3"];
[dataRoot addObject:item];
[dataRoot writeToFile:plistPath atomically:YES];
[item release];

谁能帮帮我,谢谢!

我已经更新了我的代码,但它仍然无法工作...问题是 list.plist 文件没有被复制到 ~/Documents 目录。

【问题讨论】:

    标签: iphone plist persistent


    【解决方案1】:

    您正在尝试编写在 iOS 上不可用的主包。请阅读A Few Important Application Directories

    但您的编码归结为以下几点:

    1. 检查 plist 是否不在 Application_Home/Documents/
    2. 从主包复制的原始 plist 是第 1 步的答案是 false
    3. 打开Documents目录下的plist
    4. 更新 NSMutableArray
    5. 写入 plist 文件

    【讨论】:

    • 请参考我的更新,我还是不能用,谢谢~
    • 您问题中的代码仍然指向主包中的文件。您没有在我的回答中执行第 2 步,即将 plist 从主包复制到文档文件夹。
    • 是的,这是我不明白的地方,我想如果循环复制,你能告诉我一些如何从包复制到本地和向后复制的代码吗?
    • 有很多关于这个问题的代码示例。例如:iPhone (iOS): copying files from main bundle to documents folder error
    【解决方案2】:

    我认为代码没有错。

    你检查过 plistPath、dataRoot 和 item 了吗?

    它们有正确的价值吗?

    【讨论】:

    • 我想这是我能想到的最简单的结构,有一点我不明白,如果我在根目录和字典之间有多个级别,我的程序怎么知道在哪里写一个新字典?
    • @Michael 如果您将文件读取为 nsmutablearray。多级 plist 不是很重要的事情。程序将对象添加到 nsmutablearray。
    • @Michael 和 How to get plistPath 不是好方法。使用 NSSearchPathForDirectoriesInDomains 函数。
    【解决方案3】:

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);

    NSString *documentsDirectory = [paths objectAtIndex:0];
    
    NSString *filePath = [documentsDirectory stringByAppendingPathComponent:@"list.plist"];
    
    
    if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) {
    
    
    bingoArray = [[NSMutableArray alloc] initWithContentsOfFile:filePath];
    
    }
    
    [bingoArray writeToFile:filePath atomically:YES];
    

    【讨论】:

      【解决方案4】:

      默认只能保存原始类型。

      试试这个链接。

      http://deadpanic.com/howtosave

      他解释了如何使用 NSCoding 协议将任何对象保存到磁盘。

      如果您只使用原语,那么对于浪费您的时间我深表歉意。但这是我将自定义内容写入磁盘的路径。而且我认为这只是一个数组问题。

      编辑:

      我刚刚注意到...您似乎正在尝试写入 Main Bundle 中的数组。这些文件是只读的。

      您需要在 Documents 目录中保存该文件的副本。

      试试这个找到文档目录

      NSFileManager *fileManager = [NSFileManager defaultManager];
      NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
      NSString *documentsDirectory = [paths objectAtIndex:0];
      
      // Change your plistPath to be this
      plistPath = [documentsDirectory stringByAppendingPathComponent:@"list.plist"];
      [dataRoot writeToFile:plistPath atomically:YES];
      

      把你的 plist 放在这个文件夹里,你就可以写信了。

      【讨论】:

      • 对不起,这三行代码我不太明白,什么是“cory”?这是一个包含 plist 的目录吗?我在哪里设置这个目录?
      • 我更正了拼写错误。 Volure 意味着输入 NSDocumentDirectory。
      • 现在我只是在上面的代码之前添加了这三行,但是我不知道怎么做,你能给我举个例子吗?
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2012-06-24
      • 1970-01-01
      • 2014-12-16
      • 2012-07-14
      • 2012-03-09
      相关资源
      最近更新 更多