如何使用Realm“实时”对象并保持数据库层与其他层(业务,UI等)分离?

时间:2016-11-02 15:51:49

标签: android architecture realm

我正在玩Realm for Android。

我喜欢自动更新对象的想法,但我对它有关软件架构的担忧。

我已经看到许多提议的体系结构指定了一个层来处理数据/数据库访问,理想情况下,更高层不会知道有关数据库实现的细节。这将有助于可维护性,模块化等。

当你使用Realm对象时,如果你想利用它们的自动更新属性,我能想到的最常见的方法就是在Activity / Fragment代码上使用这些对象。现在让我们假设用户刚刚在屏幕上编辑数据(由引擎盖下的领域对象表示)并保存这些编辑。如果你调用这个对象的setter,那实际上是一个数据库操作,你需要一个事务。通过在活动/片段代码上创建数据库事务,架构就会崩溃,因为您要让UI /业务层了解数据库实现细节。

我的问题是:如何以不损害架构的方式利用Realm自动更新对象?

附注:我在最近的应用程序中使用了Realm,对于每个查询,我们都必须将结果复制到非托管对象,以便我们可以将它们发送到UI /业务层。我不认为那是最好的策略,因为我们无法充分利用Realm。

1 个答案:

答案 0 :(得分:4)

经过一番研究后,我得出结论,确实需要做出一个关于将Realm集成到应用程序的主要选择:安全集成x深度集成。

安全整合

在这里,您将Realm与应用程序代码的其余部分隔离开来。为此,您无法使用Realm的自动更新/零拷贝。相反,您将拥有非托管副本,以确保访问对象的任何位置,您不会遇到访问相同对象的不同线程的问题。通过这种方式测试更容易。

深度整合

在这里,您将充分利用Realm,在请求时延迟加载数据。缺点是代码的其他层将意识到Realm,因为他们需要确保不同的线程不会访问托管对象。如果您没有启动新的应用程序,这个选项可能会涉及大量重构,但会带来零拷贝方法的性能优势。

我的回答基于以下文章:https://medium.com/@Viraj.Tank/realm-integration-in-android-best-practices-449919d25f2f#.ms3nenq0mhttps://medium.com/@Viraj.Tank/deep-integration-of-realm-in-android-production-code-part-2-with-mvp-4cf44ab6289d#.qq4p12mtw