iOS:从字典中的.plist读取数据

时间:2014-01-14 13:11:00

标签: ios objective-c cocoa

我想从.app目录中的plist中检索数据。 我无法弄清楚如何获取子词典数据。例如,我想获得MemoriesDictionary/Memory1/Event1/EventName值。

Dictionaries

我可以将MemoryCount值转换为iMemCount,只需:

int iMemCount;

//Do file searching/getting for plist

NSString *plistDirectory = [[NSBundle mainBundle] pathForResource:@"memoryDetails" ofType:@"plist"];
NSLog(@"array: %@",plistDirectory);

NSFileManager *fileManager = [NSFileManager defaultManager];

if ([fileManager fileExistsAtPath: plistDirectory]) //4
{
    NSLog(@"exists");
    NSMutableDictionary *savedStock = [[NSMutableDictionary alloc] initWithContentsOfFile: plistDirectory];

    iMemCount = [[savedStock objectForKey:@"MemoryCount"] intValue];


} else {
    NSLog(@"Does Not Exist");
    iMemCount = 0;
}

2 个答案:

答案 0 :(得分:6)

NSString *string = savedStock[@"MemoriesDictionary"][@"Memory1"][@"Event1"][@"EventName"];

修改

你也可以改写:

int iMemCount;
iMemCount = [[savedStock objectForKey:@"MemoryCount"] intValue];

as

NSInteger iMemCount;
iMemCount = [savedStock[@"MemoryCount"] integerValue];

您确实应该考虑在64位处理器上运行iOS代码的可能性,并使用适当的平台安全类型(NSIntegerCGFloatCFIndex等)

答案 1 :(得分:1)

另请注意,在此处使用NSMutableDictionary可能无法达到预期效果:顶级字典将是可变的,但所有子对象(数组,字典)都将是不可变的,并且如果您尝试访问它们则会抛出异常。

总的来说,我要小心不要在词典中进行多层次的查找,因为这通常表明你正在做一些艰难的事情。我喜欢遵循的模式是创建可以自己读写字典的类,然后当我在文件中读取时创建可以直接查询的实例。

处理一堆带有一串字符串键的可变字典是心痛和灾难的一个方法。您将失去编译时类型检查和编译时变量名称检查和可读性。

另外,我不知道这是否是一个人为的示例文件,但我不会明确地将计数写入文件 - 只需根据需要进行计算。复制数据会导致数据不同步。似乎MemoriesDictionary真的想成为一个数组,如果记忆的名字在子词典中,并且键用于保持记忆的顺序。