2010-07-19 80 views
3

我的应用程序中有大量需要访问的数据,但不会被应用程序更改。目前,我在JSON文件和SQL数据库的其他应用程序中使用这些数据,但在iOS中使用这些数据都不那么直截了当。在iOS应用程序中存储静态数据的最佳方式是什么?

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

将数据存储在PropertyList文件中并构建访问器类会不会是一个好主意?有没有简单的方法来合并SQLite而无需使用CoreData路线?

+0

我认为将这些数据存储到PropertyList是个好主意。我不知道你得到了多少数据,但如果它不是数千行,我认为PropertyList是一个好方法。另一个问题是,你需要查询你的数据吗?所以sqlite可能是一个答案。 – choise 2010-07-19 09:15:05

回答

4

如果数据量相对较小,则只能使用plist。 Plist被完全加载到内存中,因此只有在需要时才能将内存中由plist创建的所有对象一次性维持到内存中,才能真正使用它们。

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

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

当然,如果您已经掌握了在C中管理SQL的高超技巧,那么您个人可能会通过使用SQL更快地将应用程序推向市场。但是,如果你想知道你应该在Apple平台上使用什么,核心数据几乎总是答案,你应该花时间去了解它。

3

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

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

3

根据您的数据类型,大小以及更改的频率,您可能希望将事情简单化并使用属性列表。否则,使用SQLite(记录在Jergason的答案中)将是我要去的地方。虽然让我说,如果你有一个相对较少(少于几百)的基本类型(数组,字典,数字,字符串)不频繁变化的集合,那么属性列表在我看来是更好的选择。作为一个例子,在我的一个游戏中,我根据难度创建了单个属性列表中的关卡。由于每个难度(99)只有少数几个级别,并且每个参数(游戏中的元素数量,它们的初始位置,质量等)都有一小组参数,所以它是有意义的,我不必直接与SQLite打交道或者更糟糕的是,建立和维护CoreData。

1

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

如果它是一堆对象,那么JSON或(二进制)plist并不是可怕的格式,因为您希望整个事情加载到内存中以走过对象图。比较空间效率和加载性能来选择使用哪一个。

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

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

相关问题