读/写与应用程序捆绑的plist文件

时间:2010-09-26 12:46:06

标签: iphone plist nsdictionary

我正在为我的应用构建一个加载项,用户可以在列表中搜索预先填充了.plist文件数据的项目。这是一个NSDictionary。如果用户搜索的术语不存在,则用户可以点击+按钮并添加它,以便下次在那里。

首先我认为它会像使用NSUserDefaults一样容易,但会出现一些问题。

要包含列表,我必须将它放在捆绑包中,但如果它在那里,我就无法添加新的键/值对。我只能对位于Documents文件夹中的文件进行操作。

所以我想我必须捆绑plist,然后在第一次运行时我会将它移动到文档文件夹并在那里访问它。

当我需要更新应用程序时,这会打开问题,我想它会覆盖用户输入的值。

是否有一种安全,易于理解,正确的方式来实现我描述的功能?

感谢您提供的任何帮助:)

修改: * ** * 实际方法,如TheSquad和TomH * ** * *

+ (NSMutableDictionary*) genericProducts {

    NSFileManager *fileManager = [NSFileManager defaultManager];
    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [documentPaths objectAtIndex:0];
    NSString *documentPlistPath = [documentsDirectory stringByAppendingPathComponent:@"GenericProducts.plist"];

    NSString *bundlePath = [[NSBundle mainBundle] bundlePath];  
    NSString *bundlePlistPath = [bundlePath stringByAppendingPathComponent:@"GenericProducts.plist"];


    if([fileManager fileExistsAtPath:documentPlistPath]){

        NSMutableDictionary *documentDict = [NSMutableDictionary dictionaryWithContentsOfFile:documentPlistPath];
        return documentDict;

    } else {

        NSError *error;
        BOOL success = [fileManager copyItemAtPath:bundlePlistPath toPath:documentPlistPath error:&error];

    if (success) {
        NSMutableDictionary *newlySavedDict = [NSMutableDictionary dictionaryWithContentsOfFile:documentPlistPath];
        return newlySavedDict;
    }

    return nil;
}

}

将新产品添加到列表中:

+ (void) addItemToGenericProducts:(NSString*) newProduct {

    NSArray *documentPaths = NSSearchPathForDirectoriesInDomains(NSDocumentDirectory, NSUserDomainMask, YES); 
    NSString *documentsDirectory = [documentPaths objectAtIndex:0];
    NSString *documentPlistPath = [documentsDirectory stringByAppendingPathComponent:@"GenericProducts.plist"];
    NSMutableDictionary *documentDict = [NSMutableDictionary dictionaryWithContentsOfFile:documentPlistPath];
    [documentDict setObject:newProduct forKey:[MD5Checksum cheksum:newProduct]];

    [documentDict writeToFile:documentPlistPath atomically:YES];

}

2 个答案:

答案 0 :(得分:2)

我和我的sqlite数据库有同样的想法...

我最终这样做,将捆绑的文件复制到文档中,以便能够修改它。

我所做的是在每次启动时检查文件是否存在,如果不存在,则复制它。 如果您更新了应用程序,则不会触摸文档文件夹,这意味着先前版本中的复制文件仍然存在。

唯一的问题是,如果您希望升级plist,则必须在应用程序中处理。如果您必须这样做,我建议您使用NSUserDefault检查之前版本的应用程序是否存在...

答案 1 :(得分:2)

更新应用程序时,不会更改文档目录的内容。

当用户删除应用程序时,将删除文档目录的内容。

当应用程序运行时,第一次向NSUserDefaults写一个标志。在应用程序的后续运行中,检查是否存在该标志。 (或者,您可以检查文档目录中是否存在plist)