我想从.app目录中的plist中检索数据。
我无法弄清楚如何获取子词典数据。例如,我想获得MemoriesDictionary/Memory1/Event1/EventName
值。
我可以将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;
}
答案 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代码的可能性,并使用适当的平台安全类型(NSInteger
,CGFloat
,CFIndex
等)
答案 1 :(得分:1)
另请注意,在此处使用NSMutableDictionary可能无法达到预期效果:顶级字典将是可变的,但所有子对象(数组,字典)都将是不可变的,并且如果您尝试访问它们则会抛出异常。
总的来说,我要小心不要在词典中进行多层次的查找,因为这通常表明你正在做一些艰难的事情。我喜欢遵循的模式是创建可以自己读写字典的类,然后当我在文件中读取时创建可以直接查询的实例。
处理一堆带有一串字符串键的可变字典是心痛和灾难的一个方法。您将失去编译时类型检查和编译时变量名称检查和可读性。
另外,我不知道这是否是一个人为的示例文件,但我不会明确地将计数写入文件 - 只需根据需要进行计算。复制数据会导致数据不同步。似乎MemoriesDictionary真的想成为一个数组,如果记忆的名字在子词典中,并且键用于保持记忆的顺序。