如何成功写入plist?
Posted
技术标签:
【中文标题】如何成功写入plist?【英文标题】:How to write to plist successfully? 【发布时间】:2011-08-31 08:46:27 【问题描述】:在阅读了许多教程、其他人的问题并为自己尝试之后,我无法将我的文件写入 plist。我可以毫无问题地阅读 plist,但我无法更新它。以下是我如何将数据写入 plist 的代码。如果我犯了任何错误,请纠正我。
NSString *path = [[NSBundle mainBundle] pathForResource:@"EventAddress" ofType:@"plist"];
NSMutableDictionary *myDictionary = [[NSMutableDictionary alloc] initWithContentsOfFile:path];
NSArray* allmyData = [myDictionary allValues];
// creates and array to store only the event details
NSMutableArray *data = [[NSMutableArray alloc] initWithArray:allmyData];
[data addObject:[[NSMutableDictionary alloc] initWithObjectsAndKeys:tfAddress.text, @"Address", tvEvents.text, @"Events", nil]];
[myDictionary setValue:data forKey:@"Whampo"];
BOOL flag = [myDictionary writeToFile:path atomically:YES];
if (flag)
NSLog(@"write to plist success");
NSLog(@"%@", myDictionary);
[myDictionary release];
路径正确,文件存在,我在textView和textField中的值在数组中,但是到writeToFile的时候,并没有反映到位于文档目录下的文件上。
编辑 01:
我在网上找到了这个,与 Nekto 的建议非常相似。但我正在考虑如何用他的代码实现我的代码。我认为它很简单,但我似乎无法弄清楚如何。
NSArray *paths= NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentDirectory = [paths objectAtIndex:0];
NSString *plistDirectory = [NSString stringWithFormat:@"%@/Enterprise",documentDirectory];
NSString *mPath = [plistDirectory stringByAppendingPathComponent:@"Downloads.plist"];
[mDownloadsArray writeToFile:mPath atomically:YES];
iphonesdk.blogspot 取自该站点。
编辑 02:
我使用了 Nekto 的建议,效果很好。但我很好奇为什么它返回 DocumentsEventAddress.plist 而不是 EventAddress.plist。我的假设是因为
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *plistPath = [rootPath stringByAppendingString:@"EventAddress.plist"];
rootPath 在哪里返回Document
,对吗?
【问题讨论】:
可以替换NSString *documentDirectory = [paths objectAtIndex:0];
=> NSString *documentDirectory = [paths lastObject];
一开始我什至没有使用NSString *documentDirectory = [paths objectAtIndex:0];
... :P 但是是的,我会在我的代码测试中记住这一点:)
【参考方案1】:
我正在以这种方式写入文件:
NSString *errorDesc = nil;
NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
NSString *plistPath = [rootPath stringByAppendingString:TEMPLATES_PATH];
NSDictionary *dict = [NSDictionary dictionaryWithObject:templates forKey:@"templates"];
NSData *plistData = [NSPropertyListSerialization dataFromPropertyList:dict format:NSPropertyListXMLFormat_v1_0 errorDescription:&errorDesc];
if (plistData)
[plistData writeToFile:plistPath atomically:YES];
else
NSLog(@"[Error] Application Did Enter Background saving file error: %@", errorDesc);
[errorDesc release];
请务必将文件保存在应用文档目录中。
【讨论】:
这是错误的方法吗?我将这一行:NSString *path = [[NSBundle mainBundle] pathForResource:@"EventAddress" ofType:@"plist"];
替换为:NSString *rootPath = [NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES) lastObject];
代码甚至没有写入 plist 文件,并且文档目录也没有该文件。我认为它可以通过替换来工作
在rootPath
中,您将只有 App Doc 目录的路径。只需添加 filename 一切都会好的!例如NSString *path = [rootPath stringByAppendingString:@"EventAddress.plist"];
并在writeToFile:
方法中使用path
。
好的!我去试试看。我希望它真的有效,已经为此工作了数周! 编辑: 遗憾的是,它没有用......我一定在这里遗漏了一些步骤:(
应用文档目录中没有创建文件吗?
试试这个:NSString *path = [rootPath stringByAppendingString:@"/EventAddress.plist"];
【参考方案2】:
我不相信您可以写入资源。只能写入文档目录中的文件。
【讨论】:
【参考方案3】:您无法写入位于 Bundle 中的文件。 app bundle 是只读的。
【讨论】:
好的,将尝试@Nekto 对您的回复提出的建议:) 显然没有。我有一种感觉我做错了,但是通过查看他的代码。我似乎不知道如何将我的代码与他的代码相匹配,以使其正常工作以上是关于如何成功写入plist?的主要内容,如果未能解决你的问题,请参考以下文章
如何将 NSMutableDictionary 写入 Plist
在 BASH 中,如何使用 plist 上的默认值写入数组中的现有元素?
我们如何在 NSMutableArray 中添加带有 Image 作为对象的 NSMutableDictionary 并将这个数组写入 Plist