2010-09-26 59 views
1

我正在构建一个附加到我的应用程序,用户可以在其中搜索预填充了.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]; 

}

回答

2

我与我的SQLite数据库一样的想法...

我最终正是这样做的,复制捆绑将文件存档到文件中以便能够对其进行修改。

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

唯一的问题是,如果你想让你的plist升级,你将不得不在你的应用程序中处理它。如果你必须这样做,我建议你使用NSUserDefault来检查之前版本的应用程序是否存在...

+0

谢谢TheSquad :)我将粗略剪切的代码放在一起,并将其放在我的答案中。我工作得很好。我想我不应该覆盖plist,因为这会导致我不得不合并用户添加的内容和我添加的内容,我猜想会进行同步。很多工作的边缘案例。也许我会在未来做一些时间标记。 – RickiG 2010-09-27 09:13:43

+0

尝试在文档中更新您的文件越少,这是一个真正的痛苦,相信我!我因此得到了不好的更新,当然还有不好的评论随之而来......现在我保留每个版本的准确副本,以便测试从一个版本到另一个版本的更新,我建议你也这样做,否则你会后悔的:-) – TheSquad 2010-09-27 15:21:50

+0

如果我知道我将来会把它放进plist中,我会容易得多:) – RickiG 2010-09-29 15:34:36

2

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

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

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

+0

谢谢汤姆:)如果在测试中发现了文件,我就去测试你的建议文档文件夹。这是一种很少被调用的行为,只有在用户在正常使用之外去做某些事情的边缘情况下。因此,如果文件存在,测试带来的小额开销就会受到灵活性的影响。 – RickiG 2010-09-27 09:10:58

相关问题