搜索了所有地方后,我发现SQLite、Realm、CoreData、UserDefaults和JSON文件之间没有更好的比较.

你可以很容易地找到优点和缺点,但很难知道该用什么.

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

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

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

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

您可以随时添加/更新更多相关 case .

推荐答案

数据存储实现的大部分只是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和领域之间的不同之处在于,领域中的对象不会存储为明显的表,它有自己的魔术,即如何将数据转换为表表示形式.
  7. Firebase database美元.我在制作中没有使用这个图书馆.它已将在线实施作为主要功能.我不确定使用主要内部数据库是否正确.

总结怎么样?

我们测试中的SQLite(包装器,纯C)和领域具有几乎相同的性能.CoreData还不够好.

SQLite包装器和领域有足够好的API.

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

Database相关问答推荐

Oracle批量数据处理

什么时候需要手动重新分析 PostgreSQL 中的表?

在 ScyllaDB 中查询 100 亿行(高基数)的效率

如何使用存储在数据库表中的属性配置 Spring bean

有没有办法为 2 个具有不同包名称的应用程序提供 1 个 Firebase 数据库?

授予对具有特定前缀的多个表的权限

在 Oracle 的 Check 语句中使用子查询

两个不同数据库中的两个表之间的连接有什么问题?

触发器内的多个插入/更新语句?

如何关闭 Rails 中的updated_at列?

Tornado 的非阻塞 ORM?

Android 在用户之间同步数据

没有自动增量的sqlalchemy主键

Hibernate如何连接多个数据库

我应该在数据库模式中允许空值吗?

用 SQL 进行条件插入?

设计数据库来保存不同的元数据信息

MySQL:为什么使用 VARCHAR(20) 而不是 VARCHAR(255)?

什么是 ACID 的真实示例?

位图索引有何帮助?