写字典到 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的主要内容,如果未能解决你的问题,请参考以下文章