我正在构建一个附加到我的应用程序,用户可以在其中搜索预填充了.plist文件中的数据的列表中的项目。它是一个NSDictionary。如果用户搜索的术语不存在,用户可以点击+按钮并添加它,以便下一次出现。读取/写入与应用程序捆绑在一起的plist文件
我以为这会像使用NSUserDefaults一样简单,但会出现一些问题。
要包含列表,我必须将它放在包中,但如果它在那里,我不能将新的键/值对添加到它。这只能处理位于“文档”文件夹中的文件。
所以我想我必须捆绑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];
}
谢谢TheSquad :)我将粗略剪切的代码放在一起,并将其放在我的答案中。我工作得很好。我想我不应该覆盖plist,因为这会导致我不得不合并用户添加的内容和我添加的内容,我猜想会进行同步。很多工作的边缘案例。也许我会在未来做一些时间标记。 – RickiG 2010-09-27 09:13:43
尝试在文档中更新您的文件越少,这是一个真正的痛苦,相信我!我因此得到了不好的更新,当然还有不好的评论随之而来......现在我保留每个版本的准确副本,以便测试从一个版本到另一个版本的更新,我建议你也这样做,否则你会后悔的:-) – TheSquad 2010-09-27 15:21:50
如果我知道我将来会把它放进plist中,我会容易得多:) – RickiG 2010-09-29 15:34:36