2014-01-14 176 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