在iOS应用程序中存储静态数据的最佳方法是什么?

时间:2010-07-19 09:05:51

标签: iphone storage ios4

我的应用程序中有大量需要访问的数据,但应用程序永远不会更改。目前我在JSON文件和SQL数据库中的其他应用程序中使用此数据,但在iOS中使用它们似乎都不是很简单。

我不想使用CoreData,它提供了大量不必要的功能和复杂性。

将数据存储在PropertyList文件中并构建一个访问者类是不是一个好主意?是否有任何简单的方法可以在不使用CoreData路径的情况下合并SQLite?

4 个答案:

答案 0 :(得分:4)

如果数据量相对较小,则只能使用plist。 Plist完全加载到内存中,因此只有在您需要的时候,如果您可以在内存中同时维护plist创建的所有对象,您才能真正使用它们。

核心数据具有学习曲线,但在使用中它通常不如SQL复杂。在大多数情况下,“更简单”的SQL会导致更多编码,因为您最终必须复制Core Data的大部分功能,以便将过程SQL强加到面向对象的API中。您必须通过跟踪保留来手动管理所有数据的内存使用。每次需要数据时都会编写很多SQL代码。我已经将SQL中的几个应用程序更新为Core Data,并且在所有情况下,Core Data实现都比SQL更小,更清晰。

内存或处理器“开销”都不大。核心数据经过高度优化。在大多数情况下,现成的Core Data比手动调整的SQL更有效。 SQL中的一个次要子优化通常会破坏它可能具有的任何理论优势。

当然,如果您已经非常熟练地使用C语言管理SQL,那么您个人可能会通过使用SQL更快地将应用程序推向市场。但是,如果你想知道你应该计划在Apple平台上使用什么,核心数据几乎总是答案,你应该花时间去学习它。

答案 1 :(得分:3)

您可以使用SQLite C API直接使用SQLite,而无需使用核心数据的开销。

Here是我在您的用例中找到的教程 - 只需从SQLite数据库加载一些数据。希望这会有所帮助。

答案 2 :(得分:3)

根据数据的类型,大小和更改频率,您可能希望保持简单并使用属性列表。否则,使用SQLite(在Jergason的答案中记录)将是我要去的地方。虽然让我说如果你有一个相对较小(不到几百)的基本类型(数组,字典,数字,字符串)不经常更改,那么在我看来属性列表将是一个更好的选择

作为一个例子,在我的一个游戏中,我根据每个难度从单个属性列表创建级别。由于每个难度只有少数几个级别(99)和每个级别的一小组参数(游戏中的元素数量,它们的初始位置,质量等)然后它是有道理的,我避免直接​​处理SQLite或者更糟糕的是,设置和维护CoreData。

答案 3 :(得分:1)

“最好”是什么意思?什么样的数据?

如果它是一堆对象,那么JSON或(二进制)plist并不是可怕的格式,因为你需要在内存中加载整个东西来遍历对象图。比较空间效率和装载性能,以选择使用哪一个。

如果是一堆二进制blob,则将blob存储在一个大文件中,对该文件进行内存映射(NSDataReadingMapped a.k.a. NSMappedRead),并将索引用于blob。 iOS框架使用了这些的混合(例如,有很多.pngs,还有“other.artwork”,它只包含原始图像数据)。

如果你的类实现了NSCoding协议,你也可以使用NSKeyedArchiver和朋友,但是有一些对象图管理开销,它产生的plist格式并不适合使用。