2009-11-08 64 views
3

我有一個主要字典,其中每個條目是一個字典。我需要將它保存到plist中,然後再檢索它的內容。IPHONE:從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]; 

...但這不是保存任何東西的文件...我錯過了什麼?

感謝您的任何幫助。

回答

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

最後,什麼樣的數據類型和數量的productID?你不能序列非對象數據類型,因此,如果數量是一個整數,你需要把它包起來,像這樣:

[fruit setObject:[NSNumber numberWithInt:quantity] forKey:@"quantity"]; 

花一些時間閱讀property list serialization

+0

謝謝!!!將這行[stock writeToFile:path atomically:YES]; 將字典的詞典序列化並保存到文件中? dictionaryWithContentsOfFile會讀取相同的結構嗎? – SpaceDog 2009-11-08 21:18:33

5

dictionaryWithContentsOfFile不保存,它讀取一個文件。我沒有看到寫入該文件的任何代碼。

您將需要像這樣在您保存代碼:

[stock writeToFile:path atomically:YES]; 
1

你(重新)創建stock與文件的內容立即以書面它。由於該文件不存在,字典現在是nil。當你試圖寫出來,它不會產生任何東西。相反,您應該使用已經填充的stock版本。

(假設節省位是在同一範圍內,只是刪除啓動NSMutableDictionary *stock調用writeToFile線之上。)

(雖然,想起來了,就不能在同一個範圍。或者編譯器會抱怨在首位)