ios - 如何决定使用什么 [Sqlite, Realm, CoreData, User-default, JSON file] 来存储 iOS 数据?

标签 ios swift database optimization local-storage

到处搜索后,我发现 SQLite、Realm、CoreData、UserDefaults 和 JSON 文件之间没有更合适的比较。

您可以轻松找到优缺点,但很难知道该使用什么。

我知道这个决定完全取决于要求。但是仍然必须有一种方法来做出决定。

假设以下情况,哪些选项最适合个人,为什么?

  1. 保存用户观看历史[数据量大,只有插入、删除操作]
  2. 保存联系人号码[最多1000个号码,需要快速获取,并持续运行]
  3. 保存简单的 GET API 请求 [用于缓存]

注意:我在这里不是在谈论存储敏感信息。

欢迎随时添加/更新更多相关案例。

最佳答案

数据存储实现的大部分只是 SQLite 包装器。最常见的 iOS 实现是 SQLite、ORM、CoreData、Realm、Keychain。

实现的另一部分只是一个简单的文本。例如,UserDefaults 只是一个 XML 文件,您可以使用简单的 iOS API 对其进行编辑。但是,当您处理超过几十个元素时,出于性能原因,SQLite 包装器更有用。

那么,SQLite 包装器呢?

  1. 您可以使用 Keychain但它有几个缺点:这不是线程安全的,您只能在允许的应用程序时刻获取数据,有时它会为现有元素返回不正确的结果。这对密码很有用,仅此而已。
  2. CoreData有原生API,但有内存泄漏的缺点,API复杂,这不是线程安全的数据库,性能不好。
  3. SQLite .首先,您可以使用具有 11KB 依赖项的原生 C 库。缺点:旧式 C API、原始 SQL 查询。
  4. SQLite Swift wrapper .在这种情况下,您必须使用第三方库。但表现良好。
  5. SQLite ORM .这种方式允许在不知道谁实际映射到 SQLite 表的情况下使用你的对象。使用简单,性能不佳,依赖第三方。
  6. Realm .这确实表现出色且易于使用。但它在线程安全方面有一个缺点。 ORM 和 Realm 的区别在于 Realm 中的对象不是存储为一个明显的表,它有自己的魔力如何将数据转换为表表示。
  7. Firebase database .我没有在生产中使用这个库。它已将在线实现作为主要功能。我不确定使用主要内部数据库是否正确。

总结呢?

在我们的测试中,SQLite(Wrapper,纯 C)和 Realm 的性能几乎相同。 CoreData 不够好。

SQLite wrapper 和 Realm 有足够好的 API。

唯一的 SQLite 包装器是真正线程安全的。

关于ios - 如何决定使用什么 [Sqlite, Realm, CoreData, User-default, JSON file] 来存储 iOS 数据?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/57024491/

相关文章:

iphone - NSUnknownKeyException - 设置值 : forUndefinedKey in classfile

swift - 如何在主线程中同步运行多个方法?

sql - 使用从序列对象生成的数据库 ID 创建 Oracle View

ios - 为什么在 Xcode 7.2.1 中创建项目存档时出现此链接器错误

php - 如何连接到Oracle数据库?

database - H2数据库用户

iphone - UINavigationBar 标题在使用自定义字体时被截断

ios - 如何在 ios 中将字典的双引号数组解析为 json?

ios - 为什么 NSTimer 触发的 Action 不能由 block 指定?

ios - Swift NavigationBar 按 "Back"获取值,为什么?