2009-10-19 74 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]; 
}