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

Mat*_*dim 1 architecture android realm

我正在玩Android版Realm。

我喜欢自动更新对象的想法,但是我对软件体系结构感到担心。

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

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

我的问题是:如何以一种不会损害体系结构的方式利用Realm自动更新对象的优势?

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

Mat*_*dim 6

经过研究,我得出的结论是,确实需要对将Realm集成到应用程序做出重大选择:安全集成x深度集成。

安全整合

在这里,您将把Realm与其余应用程序代码隔离。为此,您将无法使用Realm的自动更新/零副本。取而代之的是,您将拥有非托管副本,以确保可以访问对象的任何地方,不同线程访问相同对象不会有问题。这种方式的测试更加容易。

深度整合

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

我的回答是基于以下文章:https : //medium.com/@Viraj.Tank/realm-integration-in-android-best-practices-449919d25f2f#.ms3nenq0mhttps://medium.com/@Viraj.Tank在Android生产代码部分2中与-mvp-4cf44ab6289d#/ qq4p12mtw进行深度集成