【问题标题】:When should I use the various storage mechanisms in iOS?什么时候应该使用 iOS 中的各种存储机制?
【发布时间】:2013-04-30 17:32:17
【问题描述】:

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

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

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

【问题讨论】:

  • 这个问题的答案可能是整本书的章节。每个选项都有它的目的、优点和缺点。您使用哪一种完全取决于您的需求,在某种程度上取决于您的专业知识。

标签: ios core-data persistence nsuserdefaults plist


【解决方案1】:

我尝试编写一个快速简单的常见用例列表,因为正如@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 存储。

【讨论】:

  • 此答案应作为 SO 上出色答案的原型。
猜你喜欢
  • 1970-01-01
  • 2011-06-23
  • 2019-12-26
  • 1970-01-01
  • 2010-11-13
  • 1970-01-01
  • 2023-04-02
  • 2011-04-15
  • 2017-04-10
相关资源
最近更新 更多