2010-01-22 73 views
2

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

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

回答

0

它是正确的,你的文件写入的名称是: SOEMTHINGchores.plist?

通过创建:

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

此外,什么是的输出:

[choresDictionary print]; 

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

+0

是的,这是正确的。 NSDictionary没有打印方法。 – skylerl 2010-01-22 02:43:06

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]; 
+0

路径是:path:/ Users/slehan/Library/Application Support/iPhone Simulator/User/Applications/6BBA0A58-E759-44C1-B018-829EBC5254AD/Documents/namechores.plist 但是,当我看那里时,文件。 – skylerl 2010-01-22 11:47:59

5

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

另外,你确定你正在寻找正确的文档文件夹?如果您在模拟器中有多个应用程序,则很容易在Finder中打开错误的应用程序文档文件夹。我曾经这样做过,花了我几个小时的挫折。

Edit01:

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

从NSDictionary的文档:

这种方法递归地验证了 所有包含的对象是财产 列表对象写入之前(NSData的, 的NSDate,NSNumber的,的NSString,NSArray的, 或NSDictionary中的实例) out 该文件,并且如果所有 对象不是属性列表对象,则返回NO, ,因为生成的文件不是 有效的属性列表。

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

+0

我会尝试捕获writeToFile返回的布尔值。我知道这是正确的Documents文件夹,我已经做了一些断点并查看了这些对象,并确实有正确的位置。 编辑:它返回false,我知道我正在寻找正确的文件夹,因为我目前只在模拟器中运行一个应用程序。 (必须重新格式化)。 – skylerl 2010-01-22 02:39:32

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; 
} 
0

正是你在哪里寻找文件写入信息的代码片断?

我有完全相同的代码,它适用于我。

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

/用户/ MyUserName输入/库/应用程序支持/ iPhone模拟器/用户/应用/ 0E62A607-8EEB-4970-B198-81CE4BDDB7AA /文档/ data.plist

与十六进制数字的路径数随着每次运行而改变。所以我打印每一次运行的文件路径。

+0

我正在寻找一个同样的地区;我只是不认为它是写作。 – skylerl 2010-01-22 11:44:37

+0

只有在每次运行时清除仿真器,路径中的GUID才会更改,否则应该使用相同的路径。 – 2010-11-05 17:30:16

0

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

现在插入一个破发点,当你走出拖动鼠标choresDictionary和它的大小是不为0x0的提示检查或者你可以简单地做的choresDictionaryNSLog(@"%@",choresDictionary);一个的NSLog我认为你的字典有0个关键键值对,这就是为什么你在你的文档文件夹中变为空值。

感谢,

Madhup

0

我也陷入了这个问题为好。在我的情况下,事实证明,我正在使用NSNumbers作为键 - 这是无效的。

+0

你能详细说明为什么这是无效的/有效的? – 2012-10-29 20:48:14