Plist不保存从字典(到文档)

时间:2010-01-22 01:50:41

标签: iphone save plist nsdictionary documents

我一直在尝试将NSDictionary的plist保存到我的应用程序的Documents文件夹中。我还没有在设备上试过这个,但是我希望它可以在模拟器上进行测试。 [self createDictionaryFromChoreList]方法只是从我的另一个类中的某些数据创建一个NSDictionary。我几乎从Web文档中复制/粘贴了这段代码,当我去查看文件是否已保存时,我发现它不是。这是方法块。

    NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *plistName = [[NSString alloc] initWithFormat:@"%@chores.plist", self.firstName];
NSString *path = [documentsDirectory stringByAppendingPathComponent:plistName];

NSDictionary *choresDictionary = [[NSDictionary alloc] initWithDictionary:[self createDictionaryFromChoreList]];
[choresDictionary writeToFile:path atomically:YES];

非常感谢任何帮助。提前谢谢。

-S

7 个答案:

答案 0 :(得分:5)

您还应捕获writeToFile:atomically:返回的BOOL。这将告诉您写入是否成功。

另外,您确定要查找正确的文档文件夹吗?如果您在模拟器中有多个应用程序,则很容易在Finder中打开错误的应用程序文档文件夹。我这样做了一次,这让我感到沮丧几个小时。

Edit01:

writeToFile:atomically:返回false解释了为什么没有文件存在。最简单的解释是字典中的某些东西不是属性列表对象。

来自NSDictionary docs:

  

此方法以递归方式验证   所有包含的对象都是属性   列表对象(NSData的实例,   NSDate,NSNumber,NSString,NSArray,   或写出来之前的NSDictionary)   文件,如果全部则返回NO   对象不是属性列表对象,   因为结果文件不会   有效的房产清单。

它只需要将一个非plist对象深埋在字典中,以防止它被转换为plist。

答案 1 :(得分:1)

这是我非常迅速地编写的内容,它正确地将名称和公司的plist目录写入文档目录。我有一种感觉你的字典创建方法可能有问题。亲自尝试一下,然后添加代码并确保它有效。

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *plistDirectory = [paths objectAtIndex:0];
NSString *plistPath = [plistDirectory stringByAppendingPathComponent:@"userCompany.plist"];

NSArray *userObjects = [[NSArray alloc] initWithObjects:@"Joe", @"Smith", @"Smith Co", nil];
NSArray *userKeys = [[NSArray alloc] initWithObjects:@"First Name", @"Last Name", @"Company", nil];

NSDictionary *userSettings = [[NSDictionary alloc] initWithObjects:userObjects forKeys:userKeys];

[userSettings writeToFile:plistPath atomically:YES];

答案 2 :(得分:1)

不要忘记序列化plist数据:

以下是我用于将信息写入plist的代码片段

NSString *errorString;

NSData *data = [NSPropertyListSerialization dataFromPropertyList:plistDict 
                                                       format:NSPropertyListXMLFormat_v1_0 
                                              errorDescription:&errorString];
[plistDict release];

if (!data) {
  NSLog(@"error converting data: %@", errorString);
  return NO;    
}

if ([data writeToFile:[XEraseAppDelegate loadSessionPlist] atomically: YES]) {
  return YES;
} else {

   NSLog(@"couldn't write to new plist");

 return NO;
}

答案 3 :(得分:0)

是否正确,您写的文件名是:  SOEMTHINGchores.plist?

通过以下方式创建:

NSString *plistName = [[NSString alloc] initWithFormat:@"%@chores.plist", self.firstName];

另外,输出是什么:

[choresDictionary print];

一些额外的信息将有助于调试此事。

答案 4 :(得分:0)

你到底在哪里找文件?

我有完全相同的代码,它对我来说很好。

只是我必须深入挖掘文件。类似的东西:

/ Users / myUserName / Library / Application Support / iPhone Simulator / User / Applications / 0E62A607-8EEB-4970-B198-81CE4BDDB7AA / Documents / data.plist

路径中的十六进制数随每次运行而变化。所以我每次运行都会打印文件路径。

答案 5 :(得分:0)

处插入一个断点
NSDictionary *choresDictionary = [[NSDictionary alloc] initWithDictionary:[self createDictionaryFromChoreList]];

现在当你离开时将鼠标拖过choresDictionary并检查工具提示其大小不是0x0,或者你可以简单地执行choresDictionary的NSLog 像NSLog(@"%@",choresDictionary);我认为你的字典有0个键值对,这就是为什么你在文档文件夹中得到null。

谢谢,

Madhup

答案 6 :(得分:0)

我也遇到了这个问题。在我的情况下,事实证明我使用NSNumbers作为密钥 - 这是无效的。