在搜索到处之后,我发现SQLite,Realm,CoreData,UserDefaults和JSON文件之间没有更合适的比较。
您可以轻松找到优缺点,但很难知道要使用什么。
我知道这个决定完全取决于要求。但仍然必须有一种方法来做出决定。
假设以下情况,哪些选项最适合个人,为什么?
- 保存用户观看历史记录[海量数据,仅插入和删除操作]
- 保存联系电话[最多1000个号码,需要快速获取和连续操作]
- 保存简单的 GET API 请求 [用于缓存]
注意:我在这里不是在谈论存储敏感信息。
请随时添加/更新更多相关案例。
数据存储实现的大部分只是SQLite包装器。最常见的iOS实现是SQLite,ORM,CoreData,Realm,Keychain。
实现的另一部分只是一个简单的文本。例如,UserDefaults只是一个XML文件,您可以使用简单的iOS API对其进行编辑。但是,当您使用数十个以上的元素时,出于性能原因,SQLite 包装器更有用。
那么,SQLite包装器呢?
- 您可以使用钥匙串,但它有几个缺点:这不是线程安全的,您只能在允许的应用程序时刻获取数据,有时会为现有元素返回不正确的结果。这对于密码很有用,仅此而已。
- CoreData有原生API,但它有内存泄漏的缺点,API复杂,这不是一个线程安全的数据库,性能不好。
- SQLite。首先,您可以使用具有 11KB 依赖项的本机 C 库。缺点:旧式C API,原始SQL查询。
- SQLite Swift wrapper.在这种情况下,您必须使用第三方库。但表现良好。
- 领域。这确实执行良好且易于使用。但是它有一个线程安全的缺点。ORM 和 Realm 的区别在于,Realm 中的对象不是存储为一个明显的表,它有它自己的魔力,如何将数据转换为表表示。
- 火力数据库。我没有在制作中使用此库。它已将在线实施作为主要功能。我不确定使用主内部数据库是否正确。
总结呢?
在我们的测试中,SQLite(Wrapper,纯C)和Realm具有几乎相同的性能。CoreData还不够好。
SQLite 包装器和 Realm 有足够好的 API。
唯一的SQLite包装器实际上是线程安全的。
在iOS中保存数据的可用选项。
用户默认值:Quicky 保留少量数据。
可编码(NSCoder):用于保存自定义对象。
钥匙串:安全存储少量数据。
SQLite:持久化大数据,但需要查询操作。
核心数据:面向对象的数据库。
领域:更快、更简单的数据库解决方案。
CoreData,Sqlite和Realm在店内存储纯文本 如果你不告诉它加密,你可以使用加密来保证它的安全。
-
保存用户观看的历史记录 [海量数据,仅插入和删除操作]应该使用 Coredata & Realm。
-
保存联系电话 [最多 1000 个号码,需要快速获取和连续操作]应该使用 Coredata & Realm。
-
保存简单的 GET API 请求 [用于缓存]应使用 Codable、Coredata & Realm。响应可用于 脱机存储。
数据存储和缓存非常重要的主题。选择存储数据的方式可以依赖于整个应用程序设计。
缓存:
NSURLCache:配置所需大小的缓存的简单选项。适用于缓存不需要任何后处理的数据(JSON、图像请求)。
let URLCache = NSURLCache(memoryCapacity: 4 * 1024 * 1024, diskCapacity: 20 * 1024 * 1024, diskPath: nil)
NSURLCache.setSharedURLCache(URLCache)
文件缓存:如果您需要以某种方式发布处理数据(例如图像上的圆角,从 JSON 构建自己的数据结构),则可以选择文件缓存。图像可以保存为纯文件,对于数据对象,您可以使用NSCoding
协议。
数据库:对于完全工作的离线模式,最好使用数据库。
坚持:
NSUser默认值:小块数据。不安全,没有同步。
SQLite:内存高效且跨平台。通常不是最佳选择。当您想在应用程序中共享现有的跨平台数据库时很有用。
核心数据:当您需要复杂的查询和对象之间的复杂关系时,这是一个不错的选择。具有基本的迁移支持和可视化代码编辑器(带代码生成器)。除非您需要,否则它可能应该是默认选项:同步或跨平台。
YapDatabase:比CoreData更快。有iCloud同步。
Realm:有文章说它比 CoreData 和线程安全更快。有很多选择,其中一些是付费的(如同步)。可能是CoreData的一个很好的选择。
Firebase:云平台。具有离线模式,但已付费。
沙发基地:免费同步。无需迁移,因为非常灵活的架构。
结论是:
简单记录:UserDefaults,NSCoding本地数据存储,复杂记录:CoreData (Yap,Realm)同步:CouchDB,Yap(iCloud),
CoreData(iCloud-),Realm(付费),Firebase (Paid)速度:
Yap,Realm
Patform或基于云的:Firebase,Parse
Cross-platform:Realm,CouchDB,MongoDB,Firebase
我个人的看法如下:
-
核心数据:来自Apple,本机,可视化编辑器的良好支持,大多数用例的良好性能,但在我看来,API非常不舒服。
-
领域:简单的 API,令人难以置信的速度,轻松的迁移。但就个人而言,线程问题让我很困扰。使用 Realm 处理线程既困难又烦人。其余的,对我来说似乎很棒。另一件事,它也为APP增加了一些大小,但这是值得的。
如果你问我个人,我喜欢 Realm,我也经常使用 Core Data,但最终还是坚持使用 Realm。