20

我认为这已经涵盖了,但我的搜索没有返回任何相关性。

我知道有 NSUserDefaults、Core Data、对象归档、原始 SQLite、plist,当然还有 Web 服务器的存储。对于初学者来说,不清楚且有些模糊的是何时使用这些不同的工具。

Web 服务器与 Core Data 的用法很明显,但是 NSUserDefaults 与 plists 呢?核心数据与对象归档?一个简单的用例分解真的可以帮助我理解为什么 iOS 中有这么多的存储选项。

4

1 回答 1

25

我尝试编写一个快速简单的常见用例列表,因为正如@rmaddy 所说,这个答案可以填满一本书的章节:

  • NSUserDefaults:存储简单的用户偏好,没有太复杂或安全的东西。如果您的应用程序有一个带有几个开关的设置页面,您可以在此处保存数据。

  • Keychain(请参阅SSKeychain以获得出色的包装):用于存储敏感数据,例如凭据。

  • PLists:用于存储较大的结构化数据(但不是很大):它是一种非常灵活的格式,可以在大量场景中使用。一些例子是:

    • 用户生成的内容存储:一个简单的地理点列表,将通过地图或列表显示。
    • 为您的应用程序提供简单的初始数据:在这种情况下,plist 将包含在 NSBundle 中,而不是由用户生成并由用户数据填充。
    • 将应用程序的特定模块所需的数据与其他数据分开。例如,构建分步启动教程所需的数据,其中每个步骤都与其他步骤相似,只是需要不同的数据。对这些数据进行硬编码很容易填充您的代码,因此您可以成为更好的开发人员并使用 plist 来存储数据并从中读取数据。
    • 您正在编写一个库或框架,可以由使用它的开发人员以某种方式配置。
  • Object archiving对于序列化更复杂的对象(可能充满二进制数据)可能很有用,这些对象不能(或您不想)映射到更简单的结构(如 plist)上。

  • Core Data功能强大,可以由不同的持久存储支持(SQLite 只是其中之一,但您也可以选择 XML 文件,甚至可以编写自己的格式!),并给出元素之间的关系。它很复杂,并提供了许多对开发有用的特性,如 KVO 和上下文。您应该将它用于包含许多相关记录的大型数据集,这些记录可能是用户生成的或由服务器提供的。

  • Raw SQLite当您需要非常非常快速地访问关系数据源(Core Data 引入了一些开销),或者如果您需要跨多个平台支持相同的 SQLite 格式(您永远不应该弄乱 CoreData 内部 SQLite:它使用自己的格式,因此您不能只在 CoreData 中“导入”现有的 SQLite)。例如,对于我工作的一个项目,Web 服务为我提供了一些大型 SQLite,而不是 jsons 或 xmls:其中一些 SQLite 被导入到 CoreData(操作可能需要一段时间,具体取决于源大小),因为我需要所有它的功能,而直接读取其他 SQLite 以实现非常快速的访问。

  • Webserver storage好吧,这应该很明显:如果您需要将数据存储到服务器,那是因为设备不应该是该数据的唯一所有者。但是,如果您只需要在不同的 iOS 设备(甚至是 Mac 移植版本的应用程序)上同步同一个应用程序,您显然也可以查看 iCloud 存储。

于 2013-05-06T23:41:10.763 回答