如何决定如何使用[Sqlite,Realm,CoreData,用户默认设置,JSON文件]存储iOS数据?

时间:2019-07-14 04:02:43

标签: ios swift database optimization local-storage

在所有地方搜索之后,我发现SQLite,Realm,CoreData,UserDefaults和JSON文件之间没有适当的比较。

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

我知道决定完全取决于要求。但是仍然必须有一种决策的方式。

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

  1. 保存用户观看的历史记录[大量数据,仅可进行插入和删除操作]
  2. 保存联系电话[最多1000个电话号码,需要快速提取并且可以连续运行]
  3. 保存简单的GET API请求[用于缓存]

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

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

3 个答案:

答案 0 :(得分:2)

数据存储实现的大部分只是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(包装器,纯C语言)和Realm具有几乎相同的性能。 CoreData不够好。

SQLite包装器和Realm具有足够好的API。

唯一的SQLite包装器实际上是线程安全的。

答案 1 :(得分:1)

可用选项在iOS中保存数据。

用户默认设置: Quicky会保留少量数据。

可编码(NSCoder):用于保存自定义对象。

钥匙串:安全地存储少量数据。

SQLite:保留大数据,但需要查询操作。

核心数据:面向对象的数据库。

领域:更快,更轻松的数据库解决方案。

CoreData,Sqlite和Realm在商店中存储纯文本,如果您不告诉它进行加密,则可以全部使用加密来确保其安全性。

  • 保存用户观看的历史记录[大量数据,仅允许插入和删除操作] 应该使用Coredata&Realm。

  • 保存联系电话[最多1000个电话号码,需要快速获取,并且可以连续运行] 应该使用Coredata&Realm。

  • 保存简单的GET API请求[用于缓存] 应该使用可编码,Coredata和Realm。该响应可用于    离线存储。

答案 2 :(得分:-2)

数据存储和缓存非常重要的主题。选择存储数据的方式可能取决于整个应用程序的设计。

缓存:

NSURLCache::用于配置所需大小的缓存的简单选项。适用于缓存不需要任何后处理(JSON,图像请求)的数据。

let URLCache = NSURLCache(memoryCapacity: 4 * 1024 * 1024, diskCapacity: 20 * 1024 * 1024, diskPath: nil)
NSURLCache.setSharedURLCache(URLCache)

文件缓存::如果您需要以某种方式发布流程数据(例如图像上的圆角,可以通过JSON构建自己的数据结构),则可以选择文件缓存。图像可以另存为普通文件,对于数据对象,可以使用NSCoding协议。

数据库:对于完全工作的脱机模式,最好使用数据库。

持久性:

NSUserDefaults :少量数据。不安全,没有同步。

SQLite:高效内存和跨平台。通常不是最佳选择。当您想在应用程序中共享现有的跨平台数据库时很有用。

核心数据:当您需要复杂的查询和对象之间的复杂关系时,这是一个不错的选择。具有基本的迁移支持和可视代码编辑器(带有代码生成器)。除非您需要,否则它可能应该是默认选项:同步或跨平台。

YapDatabase :比CoreData快。同步iCloud。

领域:比CoreData更快。线程安全。有很多选择,其中一些是付费的(例如Sync)

Firebase:云平台。具有离线模式,但已付费。

CouchBase:免费同步。不需要作为非常灵活的架构进行迁移。

总结:

简单记录: UserDefaults NSCoding
本地数据存储,复杂的记录: CoreData 领域
同步: CouchDB Yap (iCloud), CoreData (iCloud-),领域(付费), Firebase (付费)
速度:领域
基于Patform或基于云的: Firebase 解析
跨平台:领域 CouchDB MongoDB Firebase