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

Nic*_*ick 8 database optimization local-storage ios swift

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

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

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

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

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

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

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

Vya*_*lav 12

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

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

那么,SQLite 包装器呢?

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

摘要呢?

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

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

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

  • Realm 不是 SQLite 包装器 (2认同)

Ani*_*esh 6

Available Options to save data in iOS.

User Default: Quicky persists a small amount of data.

Codable (NSCoder): for saving the custom object.

Keychain: Small bit of data securely.

SQLite: Persist large data but require query operation.

Core Data: Object-Oriented Database.

Realm: Faster and easier database solution.

CoreData, Sqlite & Realm store plain text in-store if you don't tell it to encrypt, you can use encryption in all to make it secure.

  • Saving user-watched history [Huge amount of data, Only insert, and delete operation] Coredata & Realm should be used.

  • Saving contact numbers [Max 1000 numbers, Need fast fetch, and continuous operation] Coredata & Realm should be used.

  • 保存简单的GET API请求[用于缓存]应该使用Codable,Coredata和Realm。该响应可用于脱机存储。


Ser*_*nov 5

数据存储和缓存非常重要的话题。选择存储数据的方式可以依赖于整个应用程序的设计。

缓存:

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

let URLCache = NSURLCache(memoryCapacity: 4 * 1024 * 1024, diskCapacity: 20 * 1024 * 1024, diskPath: nil)
NSURLCache.setSharedURLCache(URLCache)
Run Code Online (Sandbox Code Playgroud)

文件缓存:如果您需要以某种方式发布处理数据(例如图像上的圆角、从 JSON 构建自己的数据结构)文件缓存可以是一个选项。图像可以保存为普通文件,对于数据对象,您可以使用NSCoding协议。

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

持久性:

NSUserDefaults:小块数据。不安全,不同步。

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

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

YapDatabase:比 CoreData 更快。有 iCloud 同步。

Realm:有文章说它比CoreData更快并且线程安全。有很多选项,其中一些是付费的(例如 Sync)。可能是 CoreData 的一个不错的替代品。

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

CouchBase:免费同步。不需要迁移,因为架构非常灵活。

结论是:

简单记录:UserDefaultsNSCoding
本地数据存储,复杂记录:CoreData ( Yap , Realm )
同步:CouchDB , Yap (iCloud), CoreData (iCloud-), Realm (Paid), Firebase (Paid)
速度:Yap , Realm
Patform 或基于云:FirebaseParse
跨平台:RealmCouchDBMongoDBFirebase