我一直在尝试将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
答案 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
作为密钥 - 这是无效的。