写字典到 iPhone 上的 plist

Posted

技术标签:

【中文标题】写字典到 iPhone 上的 plist【英文标题】:write a dictionary to plist on iphone 【发布时间】: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 目录。

【问题讨论】:

【参考方案1】:

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

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

    检查 plist 是否不在 Application_Home/Documents/ 从主包复制的原始 plist 是第 1 步的答案是 false。 打开Documents目录下的plist 更新 NSMutableArray 写入 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。 现在我只是在上面的代码之前添加了这三行,但是我不知道怎么做,你能给我举个例子吗?

以上是关于写字典到 iPhone 上的 plist的主要内容,如果未能解决你的问题,请参考以下文章

在 plist iPhone 中保存事件及其发生的时间

替换 plist iphone 的内容

如何显示最初从 plist iphone 中隐藏的状态栏

手写板能在网页上写字吗

win7系统中右键新建没有写字板

GRBL_ESP32写字机