ios - 什么时候应该使用 iOS 中的各种存储机制?

标签 ios core-data persistence nsuserdefaults plist

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

我知道有 NSUserDefaults、核心数据、对象归档、原始 SQLite、plist,当然还有网络服务器存储。对于初学者来说不清楚并且有些模糊的是何时使用这些不同的工具中的每一个。

Web 服务器与 Core Data 的用法很明显,但是 NSUserDefaults 与 plist 的用法呢? 核心数据与对象归档?对用例进行简单分割确实可以帮助我理解为什么 iOS 中有如此多的存储选项。

最佳答案

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

  • NSUserDefaults:存储简单的用户首选项,不要太复杂或太安全。如果您的应用有一个带有几个开关的设置页面,您可以在此处保存数据。

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

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

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

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

  • Raw SQLite 在您真正需要快速访问关系数据库时很有用 数据源(核心数据引入了一些开销),或者如果你需要在多个平台上支持相同的 SQLite 格式(你永远不应该混淆 CoreData 内部 SQLite:它使用自己的格式,所以你不能只是“导入”一个现有的CoreData 中的 SQLite)。例如,对于我工作的一个项目,web 服务为我提供了一些大型 SQLite 而不是 json 或 xml:其中一些 SQLite 被导入到 CoreData(操作可能需要一段时间,具体取决于源大小),因为我需要所有它的功能,而直接读取其他 SQLites 以实现真正快速的访问。

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

关于ios - 什么时候应该使用 iOS 中的各种存储机制?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16407594/

相关文章:

ios - 无法在iOS中读取database.sqlite文件(没有这样的表METADATA)

ios - 包含可选的过滤器数组 - SearchBar

java - 将数据存储在应用程序中

ios - 单击推送通知自定义按钮时如何打开 iOS 应用程序?

objective-c - 自定义 UIButton 背景图像显示在 iOS 6 但不是 iOS 5

swift - Xcode 7 "Extra argument ' 调用中的错误“核心数据错误”

java - 如何实现持久化查找表

java - 创建新的 NamedQuery 或构建新的 List 以返回字段值?

ios - 带有左右栏项目的中心导航栏标题?

ios - 当 Collection View 最初占据屏幕的下半部分时,如何将其拉到整个屏幕?