2

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

    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

4

7 回答 7

5

您还应该捕获由writeToFile:atomically:. 这将告诉您写入是否成功。

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

编辑01:

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

来自 NSDictionary 文档:

此方法在写出文件之前递归地验证所有包含的对象是属性列表对象(NSData、NSDate、NSNumber、NSString、NSArray 或 NSDictionary 的实例),如果所有对象都不是属性列表对象,则返回 NO,因为结果文件不是有效的属性列表。

只需将一个非 plist 对象深埋在字典中即可防止其转换​​为 plist。

于 2010-01-22T02:15:42.897 回答
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;
}
于 2010-01-22T02:34:46.990 回答
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];
于 2010-01-22T02:07:03.873 回答
0

我也遇到了这个问题。就我而言,事实证明我使用NSNumbers的是钥匙 - 这是无效的。

于 2012-02-25T00:25:52.630 回答
0

您到底在哪里寻找文件?

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

只是我必须深入挖掘才能获取文件。就像是:

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

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

于 2010-01-22T06:24:38.497 回答
0

在处插入断点

NSDictionary *choresDictionary = [[NSDictionary alloc] initWithDictionary:[self createDictionaryFromChoreList]];

现在,当您走出时,将鼠标拖到choresDictionary工具提示上并检查其大小不是 0x0 或者您可以简单地执行类似的 NSLogchoresDictionaryNSLog(@"%@",choresDictionary);认为您的字典有 0 个键键值对,这就是您在文档文件夹中获取 null 的原因.

谢谢,

马杜普

于 2010-01-22T12:00:59.377 回答
0

你写的文件名是:SOEMTHINGchores.plist,对吗?

通过创建:

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

另外,输出是什么:

[choresDictionary print];

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

于 2010-01-22T02:03:43.767 回答