Android中的Realm VS Room

76

我正在构建一个应用程序,需要在其中使用数据库。 我考虑使用 Room,因为它现在很新也很热门。 但是我也听说过关于 Realm 的很多优点。 能否有人指出使用每个的可能优势?

我做了研究并阅读了文档,但我没有经验去理解它。

Room文档

Realm文档

编辑:

已经过了一些时间,我可以指出使用 Room 的另一个原因。 虽然您可以使用 Realm 和 Transformations 将其与 LiveData 绑定,但是使用 Room 您可以直接返回 LiveData(还可以使用插件返回 RXJava 类型)用于 DB,这将为您节省一些模板代码和麻烦。

编辑2:

除了第一个编辑之外,现在 Room 在 Kotlin 中具有协程的一流支持,因此如果您计划使用它们,这将是一个不错的选择 -> https://medium.com/androiddevelopers/room-coroutines-422b786dc4c5


请查看 https://www.reddit.com/r/androiddev/comments/6dj652/realm_vs_room - AesSedai101
@AesSedai101 谢谢你提供的链接,很有用。唯一的缺点是讨论是在5个月前进行的,随着更多的人开始使用 Room,一些观点可能会改变。 - Rainmaker
1
关于这个问题被关闭的事情 - 我不同意这个问题是基于观点的。这个问题正在询问架构方向和在两种方法/库之间进行选择时的关键考虑因素。一些答案可能是基于观点的,但如果问题得到很好的回答,它将为开发人员提供客观的决策标准。 - socasanta
2个回答

88

Realm

Realm是一款相对快速和方便的库,所有链接都是直接实现的,这与数据库的面向对象有关。文档非常出色。它可能是目前在移动设备上存储数据的最佳选择,缺点只能是apk文件增加了2.5 MB的大小。

Room

作为在Android操作系统上处理数据库的最佳解决方案,Room是在Google I/O 2017上推出的有趣的解决方案。尽管需要使用明确的SQL请求,但该库非常方便,我个人非常喜欢。从性能上来看,它处于领先地位,因此我建议您选择这个特定的库。其一个重要优势是基于内置的SQLite数据库。由于这个由Google提出的解决方案将迅速变得流行,因此使用它时遇到的问题将很容易找到解决方案。

Realm使用更多的RAM,增加了apk大小和构建时间。所以我更喜欢Room。

有比较:https://github.com/AlexeyZatsepin/Android-ORM-benchmark


1
我从未使用过它,但我认为它会像Realm一样具有相同的问题和好处。 - Alexey Zatsepin
1
@AlexeyZatsepin 如果你根据架构拆分apk,那么它不会占用2.5MB的空间。它将根据架构进行缩小。 - Ravi Yadav
我在一个演示应用程序中尝试了一下,它还不错(易于使用),但是文档不够好。此外,似乎还有一堆问题需要先解决(例如,我已经等了两个月,他们的rxjava适配器才能正常工作)。我遇到的最大问题之一是自动迁移。从理论上讲,它听起来很棒,但它也有可能使事情变得不可预测和无法追踪,而且文档并不完全好,这意味着我会弄乱数据库一两次。(续) - Louis Tsai
我最终选择了使用 Room 来开发同一款应用的生产版本,以获得更好的易用性和稳定性平衡(虽然 Room 还很新,但至少 SQLite 不是,而且很容易找到资源或人来帮助)。 - Louis Tsai
2
对于 Realm,你的基准比较是不公平的。它基于一个非常老的版本的 Realm,但更重要的是,你使用了低效的代码实现,使其看起来比正确使用时更慢。 - Tim
显示剩余2条评论

11
我们选择使用数据库库的主要原因是它让我们能够对对象进行建模并使CRUD操作更加容易,我有很好的Realm使用经验,它非常易于设置和使用,速度快且灵活,但库的大小是一个问题,可以通过在构建目标ABI时拆分APK来减小APK大小,但我更喜欢使用GreenDao,因为它基于SQLite,尽管我认为它像其他任何库一样有一些缺点,但这是我最好的选择。
老实说,我还没有尝试过Room,但简要查看文档后,您会发现它更加灵活和友好,作为Google的粉丝,我更喜欢使用Google开发人员的库!就像我之前所说,我更喜欢使用超过本地SQLite的层而不是全新的数据库库
我将在我的下一个项目中尝试Room,并在稍后的更新中分享我的经验,希望能对您有所帮助。

在尝试了该房间后,我发现一个很大的问题,即处理来自数据库操作的异常。目前我认为没有办法处理数据库异常。此外,在插入、更新等数据库回调方面也没有任何方法,如行 ID 回调。 - SUHAS REKHU

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接