IPHONE:从plist中保存和检索字典词典

时间:2009-11-08 15:34:43

标签: iphone iphone-sdk-3.0

我有一个主词典,每个条目都是字典。我需要将它保存到plist然后检索其内容。

这就是我正在做的保存字典

// create a dictionary to store a fruit's characteristics
NSMutableDictionary *fruit = [[NSMutableDictionary alloc] init];
[fruit setObject:quantity forKey:@"quantity"];
[fruit setObject:productID forKey:@"productID"];
[fruit setObject:nameID forKey:@"nameID"];

// create a dictionary to store all fruits
NSMutableDictionary *stock = [[NSMutableDictionary alloc] init];
[stock setObject:fruit forKey:@"nameID"];

...将所有水果添加到股票字典后,将股票写入plist

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"stock.plist"];

NSMutableDictionary *stock = [NSMutableDictionary dictionaryWithContentsOfFile:path];
[stock writeToFile:path atomically:YES];

...恢复字典,我用

NSMutableDictionary *stock = [NSMutableDictionary dictionaryWithContentsOfFile:path];

...但这不会保存文件中的任何内容......我错过了什么?

感谢您的帮助。

3 个答案:

答案 0 :(得分:10)

你写道:

  

...将所有水果添加到   股票字典,写股票给   plist中

但是在将股票字典写入磁盘之前,您的代码正在从磁盘读取。因此假设stock.plist实际上并不存在于该路径中,您只需将stock设置为nil,那么之后您将writeToFilePath消息发送到nil。

试试这个:

NSArray *paths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES);
NSString *documentsDirectory = [paths objectAtIndex:0];
NSString *path = [documentsDirectory stringByAppendingPathComponent:@"stock.plist"];
// write plist to disk
[stock writeToFile:path atomically:YES];

// read it back in with different dictionary variable
NSMutableDictionary *savedStock = [NSMutableDictionary dictionaryWithContentsOfFile:path];
if( savedStock==nil ){
    NSLog(@"failed to retrieve dictionary from disk");
}

最后,数量类型是数量和产品ID?你不能序列化非对象数据类型,所以如果数量是一个整数,你需要像这样包装它:

[fruit setObject:[NSNumber numberWithInt:quantity] forKey:@"quantity"];

花些时间阅读property list serialization

答案 1 :(得分:5)

dictionaryWithContentsOfFile无法保存,它会读取文件。我没有看到任何写入该文件的代码。

您的保存代码中需要这样的内容:

[stock writeToFile:path atomically:YES];

答案 2 :(得分:1)

在写入文件之前,您(重新)创建了stock文件的内容。由于该文件不存在,因此字典现在为nil。当你试图写出来时,它不会产生任何东西。相反,您应该使用已填充的stock版本。

(假设保存位在同一范围内,只需删除在NSMutableDictionary *stock调用之上开始writeToFile的行。)

(虽然,考虑到它,它不能在相同的范围内,或者编译器首先会抱怨。)