我正在为我的应用构建一个加载项,用户可以在列表中搜索预先填充了.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];
}
答案 0 :(得分:2)
我和我的sqlite数据库有同样的想法...
我最终这样做,将捆绑的文件复制到文档中,以便能够修改它。
我所做的是在每次启动时检查文件是否存在,如果不存在,则复制它。 如果您更新了应用程序,则不会触摸文档文件夹,这意味着先前版本中的复制文件仍然存在。
唯一的问题是,如果您希望升级plist,则必须在应用程序中处理。如果您必须这样做,我建议您使用NSUserDefault检查之前版本的应用程序是否存在...
答案 1 :(得分:2)
更新应用程序时,不会更改文档目录的内容。
当用户删除应用程序时,将删除文档目录的内容。
当应用程序运行时,第一次向NSUserDefaults写一个标志。在应用程序的后续运行中,检查是否存在该标志。 (或者,您可以检查文档目录中是否存在plist)