2014-01-14 52 views
1

我想从我的.app目录中的plist中检索数据。 我不知道如何获取子词典数据。例如,我想获得MemoriesDictionary/Memory1/Event1/EventName的值。iOS:从.plist中读取数据字典

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

回答

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

编辑

你也可以重写:

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

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

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

+0

工程很好,但当我尝试访问int n =(NSUInteger)savedStock [@“MemoriesDictionary”] [@“Memory1”] [@“EventCount”]; NSLog([NSString stringWithFormat:@“%d”,n]);我收到一个非常大的,不正确的号码 –

+0

你没有使用我写的方法。看看你的plist规格;在Memory1下没有EventCount的密钥 – Abizern

1

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

一般来说,我会提醒不要在字典中进行几个级别的查找,因为这通常表明您正在做一些艰难的事情。我喜欢的模式是创建可以读写字典的类,然后当我读入文件时创建可以直接查询的实例。

用一串字符串键处理一堆可变词典是一个令人心痛和灾难的秘诀。您会失去编译时类型检查和编译时变量名称检查和可读性。

此外,我不知道这是否是一个人为的示例文件,但我不会明确地向该文件写入计数 - 只是根据需要进行计算。复制数据会导致数据不同步。而且,如果MemoriesDictionary真的想成为一个数组,如果存储器的名字在子字典里面,并且这些键被用来保持存储顺序。

+0

那么理想的方法是存储在级别分组中动态创建的数据? –

+0

@Wil;仔细想想这样的答案给了我们“西方最快的枪支”回答者一个坏名字。请住手。谢谢。 – Abizern