如何成功写入plist?

时间:2011-08-31 08:46:28

标签: iphone plist

在完成许多教程,其他人的问题并亲自尝试后,我无法将文件写入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是吗?

3 个答案:

答案 0 :(得分: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];
}

请务必将文件保存在应用程序文档目录中。

答案 1 :(得分:0)

我不相信你可以写信息。只能写入文档目录中的文件。

答案 2 :(得分:0)

您无法写入位于Bundle中的文件。 应用包是只读的。