为了账号安全,请及时绑定邮箱和手机立即绑定

2025年你应该选择哪种本地数据库?比较Realm、SQLDelight和Room

如果你正在启动一个全新项目(Greenfield项目),你将面临的关键决策之一是选择合适的本地数据库系统。多年来,这些数据库已经有了显著的变化,新增了许多功能并改进了一些方面,但同时也废弃了一些功能。这可能会影响你的选择。

此照片由 worldvectorlogo.com/logo/realmio-black 拍摄

如果你之前接触过数据库的话,无论是通过在Android/iOS平台上使用Kotlin或Swift,还是通过后端的SQL或NoSQL数据库经验,你会觉得这些最新特性之间的对比很有启发性。我也会分享我的建议,帮助你在新项目中选择最适合的本地数据库。

领域特别以什么闻名?

简洁胜于复杂,Realm 直接在存储的数据上操作,因此省去了中间映射步骤,速度更快。当数据库中的内容发生变化时,Realm 能够处理并发的复杂性并轻松更新视图。它易于使用,因为您可以在代码中直接操作对象,而无需编写 SQL。它还非常快速,并支持数据的自动更新功能。

— 这些年Realm都发生了哪些变化?

这个领域的数据库大小可以达到4MB,这会使APK的大小增加,这种情况多年以来一直没有改变。

你可以通过进行APK拆分法或更推荐使用Google Play提供的应用包来实现拆分并统一管理版本。

  • Realm Studio 仍然是浏览你的数据库的唯一途径,这一点一直没有改变。
  • MongoDB 收购了 Realm 这家公司。

2019年春天,MongoDB 收购了 Realm 公司,以统一后端与移动应用开发的平台,MongoDB 的云数据库产品 MongoDB Atlas

  • 2024年9月,MongoDB弃用了原生同步支持功能(即MongoDB命名的Atlas设备同步功能),计划在2025年9月移除。此功能曾允许数据自动同步至其他设备。现在开发人员需要自己制定同步策略。
  • Realm仍然支持Kotlin多平台(KMP)。
  • 对于模式变更仍需进行迁移,并提供了如 _addField_removeField_renameField 等方法来简化模式更新。
  • 分页仍然通过 _RealmResults 对象实现,支持惰性加载,并且可以通过 _subList()_limit() 方法来加载数据子集,也可以使用Realm实现Android分页功能。
  • 仍然支持Swift数据库(适用于iOS和macOS应用)、Flutter和React Native(用于跨平台)。那些希望在Android和iOS团队间保持相同数据库的人可以继续使用。
SQLDelight 在哪些方面特别厉害?

SQLDelight 采用 SQL 优先的方法,消除了传统 ORM 的限制。特别是在需要 精确的 SQL 控制 的情况下,SQLDelight 的一大优势在于你可以完全掌控查询,进行性能调整。它提供了诸如自动补全和代码重构等 IDE 功能,使编写和维护 SQL 变得更简单。

— 这些年里,SQLDelight 都有哪些变化?
  • 一直支持 Kotlin 多平台(KMP)。
  • 2023年7月26日发布了SQLDelight 2.0版本,这一版本包名从 com.squareup.sqldelight 变更为 app.cash.sqldelight,并且IDE插件得到了大幅改进。
  • 从1.3.0版本开始引入了方言支持,能够支持MySQL和Postgres的语法和约定。

据公告所述,SQLDelight 将主要重心转向服务器开发,不过 Android 和多平台方面的开发将继续得到关注和改进,不过,SQLDelight 在移动平台上的功能不会有重大改动。

  • 由于在 Android 应用中 SQLDelight 数据库是以 SQLite 数据库的形式存储的,你仍然可以通过 ADB 访问它们,或者下载数据并使用 SQLite 客户端(如 DB Browser for SQLite)浏览。
  • 提供了 RxJava、协程(Coroutines)和 Android 分页的扩展支持。
Room特别擅长做什么方面?

这种环境非常适合需要与Android Jetpack生态系统轻松集成的场景。抽象了SQLite操作,并支持编写SQL查询,提供注解以定义架构并轻松管理数据库迁移。

它能够无缝地与 LiveData 和 Flow 一起工作,支持反应式编程。非常适合那些需要良好支持的ORM,且该ORM特别为Android开发设计的应用程序。Room 进行编译时验证,在应用运行前,Room 会验证整个模式和查询。因此,编译时你可以确定你的模式和查询是语法正确的。

— 这些年里,Room 有哪些变化?
  • 仍然提供内置的迁移支持。Room 自动验证迁移操作,但对于复杂的模式变更,可能需要进行手动干预。
  • Room 现在从版本 2.7.0-alpha01 开始支持 Kotlin 多平台 (KMP) 技术。

Android 于 5月1日, 2024 发布了 Room 2.7.0-alpha01,支持 Kotlin 多平台 (KMP)

  • Room 分页功能库现已在 2024 年 9 月 18 日发布的 2.7.0-alpha08 版本中支持 KMP。
  • 强大的原生支持适用于异步数据库操作和 UI 更新。

(注释:第二句按专家建议去掉了“仍然”,但为了保持上下文的连贯性,保留了“适用于”,若直接改为“支持”,则更加简洁。)

这里没有提到的还有 Realm、SQLDelight 和 Room 的许多其他更改,我只关注主要变化。

特别提到:ObjectBox

ObjectBox 是一个 NoSQL Java 数据库,设计用于资源受限设备上的本地数据存储,优先支持离线优先功能。根据 ObjectBox 的 Github 页面,它在所有 CRUD 操作中均胜过 SQLite、Room 和 Realm。支持基于 Swift 的数据库(用于 iOS 和 macOS 应用),适用于 Go、C++ 和 Dart/Flutter。

ObjectBox Sync 能帮你在设备和服务器之间同步数据。如果你在老版本的 MongoDB Atlas 设备同步(Realm 原生同步)中遇到问题,不妨试试 ObjectBox。

ObjectBox 目前还不支持 Kotlin 多平台项目(KMP) 。

性能

Realm的性能从一开始就领先,因为Realm采用面向对象的方法,把数据库实体当作对象来处理。Realm实现了零拷贝架构,这意味着数据直接从内存读取,无需额外复制。这种方法在进行CRUD操作(创建、读取、更新、删除)时比关系型ORM映射系统要快得多。

哪个更容易与Android架构组件结合使用

Realm 有自己的一套 API,并不与 Jetpack 组件紧密集成在一起。而 SQLDelight 虽然不属于 Jetpack,但与 Kotlin 十分契合,提供了一套简洁易用的 API 来操作 SQL。

Room 是一个组件(一个 Jetpack 套件中的组件)。它与 LiveData、ViewModel 和其他组件结合得很好,因此它在现代 Android 开发中是一个很好的选择。

比较表格

让我们制作一个表格,列明功能特性及关键数据,帮助你更好地做出最终决定。

结论部分

参考这个对比表,如果性能特别重要,且你更倾向于避开SQL查询或者复杂的连接,Realm算得上是不错的选择。对于类型安全和Kotlin优先的SQL集成,SQLDelight在这方面比较突出。如果你喜欢一个传统的SQL数据库,并且与Android集成非常好,Room是个可靠的选择。

在推荐方面,我个人推荐使用Room。多年以来,Google 的积极支持使我们相信 Room 将会长期存在。Room 提供了 SQL 的灵活性,同时通过抽象查询来简化开发过程。它还支持自定义 SQL 查询,使开发人员可以利用现有的 SQL 技能。

此外,它简化了迁移管理工作,这在复杂场景中可能变得具有挑战性。Room 与 Kotlin 协程无缝集成,更重要的是,现已支持 Kotlin 多平台 (KMP),使其成为跨平台开发的未来理想选择。

参考文献:
点击查看更多内容
TA 点赞

若觉得本文不错,就分享一下吧!

评论

作者其他优质文章

正在加载中
  • 推荐
  • 评论
  • 收藏
  • 共同学习,写下你的评论
感谢您的支持,我会继续努力的~
扫码打赏,你说多少就多少
赞赏金额会直接到老师账户
支付方式
打开微信扫一扫,即可进行扫码打赏哦
今天注册有机会得

100积分直接送

付费专栏免费学

大额优惠券免费领

立即参与 放弃机会
意见反馈 帮助中心 APP下载
官方微信

举报

0/150
提交
取消