我有一个主词典,每个条目都是字典。我需要将它保存到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];
...但这不会保存文件中的任何内容......我错过了什么?
感谢您的帮助。
答案 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
的行。)
(虽然,考虑到它,它不能在相同的范围内,或者编译器首先会抱怨。)