Iphone Plist未从字典保存(到文档)

Iphone Plist未从字典保存(到文档),iphone,save,plist,nsdictionary,documents,Iphone,Save,Plist,Nsdictionary,Documents,我一直在尝试将NSDictionary的plist保存到我的应用程序的Documents文件夹中。我还没有在设备上尝试过这个,但我希望它能在模拟器上工作,以便进行测试。[self-createDictionaryFromChoreList]方法只是从我的另一个类中的一些数据创建一个NSDictionary。我几乎从web文档中复制/粘贴了这段代码,当我查看文件是否保存时,我发现它没有保存。这里是方法块 NSArray *paths = NSSearchPathForDirectories

我一直在尝试将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

您要写入的文件名是否正确: SOEMTHINGchores.plist

通过以下方式创建:

NSString *plistName = [[NSString alloc] initWithFormat:@"%@chores.plist", self.firstName];
此外,以下各项的输出是什么:

[choresDictionary print];

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

这是我很快想到的,它正确地将名称和公司的plist目录写入documents目录。我感觉你的字典创建方法可能有问题。自己尝试一下,然后添加代码并确保它能正常工作

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

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

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

Edit01:

writeToFile:atomicaly:
返回false解释了文件不存在的原因。最简单的解释是,字典中的某些内容不是属性列表对象

从NSD字典文档:

此方法递归地验证 所有包含的对象都是属性 列出对象(NSData的实例, NSDate、NSNumber、NSString、NSArray、, (或字典)然后再写出来 文件,如果所有 对象不是属性列表对象, 因为生成的文件不会 有效的属性列表


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

不要忘记序列化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;
}

你到底在哪里找文件

我有完全相同的代码,它适合我

只是我必须深入挖掘才能得到文件。比如:

/用户/myUserName/Library/Application Support/iPhone模拟器/User/Applications/0E62A607-8EEB-4970-B198-81CE4BDB7AA/Documents/data.plist


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

NSDictionary *choresDictionary = [[NSDictionary alloc] initWithDictionary:[self createDictionaryFromChoreList]];
现在,当您走出来时,将鼠标拖动到
choresDictionary
上,并在工具提示中检查其大小是否为0x0,或者您只需对
choresDictionary
NSLog(@“%@”,choresDictionary)我认为您的字典有0个键值对,这就是为什么您的文档文件夹中会出现null

谢谢


Madhup

我也遇到了这个问题。在我的例子中,原来我对键使用了
NSNumbers
,这是无效的。

我将尝试捕获writeToFile返回的布尔值。我知道它是正确的Documents文件夹,我做了一些断点并查看了对象,它们确实有正确的位置。编辑:返回false,我知道我正在查找正确的文件夹,因为到目前为止,我在模拟器中只运行了一个应用程序。(必须重新格式化)。是的,没错。而且NSDictionary没有打印方法。我正在寻找一个类似的区域;我只是不认为它在写。只有在每次运行时清除模拟器时,路径中的GUID才会更改,否则,应该使用相同的路径。路径是:path:/Users/slehan/Library/Application Support/iPhone Simulator/User/Applications/6BBA0A58-E759-44C1-B018-829EBC5254AD/Documents/namechores.plist但是当我查看那里时,没有文件。你能解释一下为什么无效/什么是有效的吗?