如何成功写入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

如何在 plist 中写入数据?

如何将这些数据写入我的 Plist? - 斯威夫特

在 BASH 中,如何使用 plist 上的默认值写入数组中的现有元素?

我们如何在 NSMutableArray 中添加带有 Image 作为对象的 NSMutableDictionary 并将这个数组写入 Plist

如何清除在 Xcode 中创建的 plist 中的数据?