iOS - plist 文件、nsuserdefaults 或文本数据文件

Posted

技术标签:

【中文标题】iOS - plist 文件、nsuserdefaults 或文本数据文件【英文标题】:iOS - plist file, nsuserdefaults or text data file 【发布时间】:2012-07-23 22:05:57 【问题描述】:

我正在开发一个需要大量数据的移动应用。简而言之,数据将用于多种语言,并包含该语言可能出现的所有单词。该应用程序将仅以英语和很多单词开头。然后用户可以选择下载更多语言及其数据。

我正在尝试找出读取/保存/更新这些数据的最佳方式。我是否应该先创建一个包含英语数据的 plist 文件,然后在用户下载新语言时继续添加更多数据?还是应该将所有数据保存在 nsuserdefaults 中?或者,我应该只包含一个包含所有数据的文本文件并即时解析它吗?

建议?

ps:我知道这是一个移动应用程序,必须考虑文件空间和解析时间

【问题讨论】:

【参考方案1】:

请在此处阅读我的回答:https://***.com/a/7215501/832065

正如该答案中所说,所有 NSUserDefaults 都存储在一个 plist 中。

plist 和 NSUserDefaults 基本相同,但是 NSUserDefaults 应该只用于保存首选项而不是大量数据。所以不要使用 NSUserDefaults!

我会考虑将其保存在 plist (NSDictionary) 中。像这样,您可以在该文件中排序所有数据。只需将“单词”(我假设为 NSString)设置为对象,将语言设置为键。

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
[dict setObject:words forKey:language];
[dict writeToFile:filePath atomically:YES];

阅读也一样:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSString *words = [dict objectForKey:language];

编辑:

如果每个单词都分配给一个数字(您可以只使用 NSArray),则差别不大:

NSMutableDictionary *dict = [NSMutableDictionary dictionaryWithContentsOfFile:filePath];
NSArray *words = [NSArray arrayWithObjects:allTheWords,nil];
[dict setObject:words forKey:language];
[dict writeToFile:filePath atomically:YES];

阅读也一样:

NSDictionary *dict = [NSDictionary dictionaryWithContentsOfFile:filePath];
NSArray *words = [dict objectForKey:language];
NSString *word = [words objectAtIndex:numberAssignedToWord];

我希望这会有所帮助! :)

【讨论】:

非常感谢您的回答。假设我必须为每个单词分配一个数字,这将是它的关键并且语言是英语,那么结构会是什么样子?例如:tea:3, save:4, water:5, good:4 这些都是英语的一部分。因此,在这种情况下,我们要存储 3 个值 只是添加另一个问题 - 改用 Core Data 怎么样?我只是想找出最好的方法。 您当然可以使用核心数据,但它的设置要困难得多,我会推荐它用于比数组更复杂的东西。接受吗?【参考方案2】:

我建议直接使用 SQL 数据库或 Core Data。如果您有大量数据,您不希望一直将这些数据完全加载到内存中。它也更容易处理数据的更新、更改或添加。

但是你的问题太笼统了,并没有说明你真正想要对数据做什么,数据有多大,以 KByte 或 MByte 为单位,很难给出任何好的答案。

将大量数据写入文本文件、用户默认值、plist 或类似文件似乎不是正确的选择。使用 Core Data 将是在 ios 上执行此类操作的默认方式。

【讨论】:

我也在想同样的事情,Core Data 将是要走的路。我要为每种语言创建分隔文本文件,大小在 30-80MB 之间。我想这是一个需要即时解析的大文件。 对。对于在文本文件、数组或任何其他建议的解决方案中管理的数据太多了。这些对于 KByte 大小的少量数据来说很好。因此,您绝对应该考虑 Core Data 或直接使用 SQLite,例如使用 FMDB 或 PLDatabase 等包装框架【参考方案3】:

我认为最简单的方法是处理 NSMutableArray 中的数据并使用 NSUserDefaults 将其存储在应用程序中。

您可以在NSMutableArray 中处理您的数据,如下所示:

NSMutableArray *yourDataStuff = [[NSMutableArray alloc] init];
[yourDataStuff addObject:@"Your data 1"];
[yourDataStuff addObject:@"Your data 2"];
[yourDataStuff addObject:@"Your data 3, etc.."];

然后您可以使用NSUserDefaults 存储它,如下所示:

[[NSUserDefaults standardUserDefaults] setObject:yourDataStuff forKey:@"myData"];

然后读取您的数据,如下所示:

yourDataStuff = [[NSUserDefaults standardUserDefaults] objectForKey:@"myData"];

【讨论】:

【参考方案4】:

我认为您无法在 NSUserDefault 中保存大数据,并且您可能无法使用 plist 进行 IO,我已经这样做了,当您读取或保存时,您必须读取整个 .plist,并且您可能会收到内存警告,或崩溃。您可以使用C (fread,fwrite) 将数据写入 .txt ,您可以使用数据流进行读写。

【讨论】:

以上是关于iOS - plist 文件、nsuserdefaults 或文本数据文件的主要内容,如果未能解决你的问题,请参考以下文章

IOS:检查 plist 文件

iOS开发之JSON转PLIST(把存储json格式的文件转换成plist文件)

iOS,plist文件pch文件

IOS 读取项目中的plist文件

ios开发之Info.plist文件相关配置

加密/解密 .plist 文件 ios