2009-10-19 128 views
5

在我的iPhone應用程序中,我有兩個plist文件來存儲「主題」。一個是包含默認主題的只讀文件,另一個包含用戶創建的自定義主題。我使用plist文件,因爲我很容易從plist中讀取並創建新的Theme對象。如何向plist添加新項目?

我的plist是一個字典對象數組。

有什麼簡單的方法來追加一個新的字典對象到我的plist文件?或者我需要將文件讀入內存,追加新的字典對象,並將其寫回文件系統?

謝謝!

+0

這是簡單的方法。你還有什麼希望? – 2009-10-19 01:11:22

+1

我挖通過文檔,看看我是否錯過了一些東西,比如便利方法來改變plists,因爲它們在Cocoa應用程序中被廣泛使用。猜猜不是:) – 2009-10-19 01:29:10

回答

5

使用Cocoa,您需要將文件讀入內存,追加新的字典對象,並將其寫回到文件系統。如果你使用XML plist,你可以很容易地解析它並遞增地寫入文件,但它也會更大一些,所以它不太值得。

如果重寫plist的時間太長,您應該使用數據庫進行調查(可能是通過核心數據)。除非文件很大,否則即使iPhone的內存容量和閃存寫入速度仍然存在,我懷疑這是一個問題。

+0

這將做!謝謝。 – 2009-10-19 01:26:57

+0

請記住,您無法寫入應用程序包。你必須找到你的應用程序的文檔目錄(使用'NSSearchPathForDirectoriesInDomain()')並寫在那裏。 – 2009-10-19 01:43:09

3

(我複製這對於那些不想點擊從一個類似的問題,我回答這裏的鏈接誰:A question on how to Get data from plist & how should it be layout

這裏有兩種方法來讀取和使用從plist中值寫入一個NSDictionary:

- (NSMutableDictionary*)dictionaryFromPlist { 
    NSString *filePath = @"myPlist.plist"; 
    NSMutableDictionary* propertyListValues = [[NSMutableDictionary alloc] initWithContentsOfFile:filePath]; 
    return [propertyListValues autorelease]; 
} 

- (BOOL)writeDictionaryToPlist:(NSDictionary*)plistDict{ 
    NSString *filePath = @"myPlist.plist"; 
    BOOL result = [plistDict writeToFile:filePath atomically:YES]; 
    return result; 
} 

,然後在你的代碼塊地方:

// Read key from plist dictionary 
NSDictionary *dict = [self dictionaryFromPlist]; 
NSString *valueToPrint = [dict objectForKey:@"Executable file"]; 
NSLog(@"valueToPrint: %@", valueToPrint); 

// Write key to plist dictionary 
NSString *key = @"Icon File"; 
NSString *value = @"appIcon.png"; 
[dict setValue:value forKey:key]; 

// Write new plist to file using dictionary 
[self writeDictionaryToPlist:dict]; 
3

這是怎麼了追加數據到plist中:

NSString *filePath = [self dataFilePath]; 
if ([[NSFileManager defaultManager] fileExistsAtPath:filePath]) 
{ 
    NSMutableArray *array = [[NSMutableArray alloc] initWithContentsOfFile:filePath]; 
    [array addObject:countdownLabel.text]; 
    [array writeToFile:[self dataFilePath] atomically:YES]; 
    [array release]; 
} 
else 
{ 
    NSArray *array = [NSArray arrayWithObject:countdownLabel.text]; 
    [array writeToFile:filePath atomically:YES]; 
}