【问题标题】:How to use Realm "live" objects and keep database layer decoupled from other layers(business, UI, etc)?如何使用 Realm“实时”对象并使数据库层与其他层(业务、UI 等)分离?
【发布时间】:2016-11-02 15:51:48
【问题描述】:

我正在玩 Android 版 Realm。

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

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

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

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

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

【问题讨论】:

  • 当然有很多很多的包装器接口/类。
  • @EpicPandaForce 我在你的个人资料中看到你写了很多关于 Realm 的文章。你有什么具体的文字涉及这个问题吗?
  • 不幸的是,它不在我的个人路线图上,但我一直都很忙/懒得去做。 :/ 当前要写的“目标”是 Flow,这个主题将在此之后出现。老实说,我更惊讶于没有人写过关于抽象领域的文章没有复制每个元素。
  • 您是否看过github.com/realm/realm-java/tree/master/examples/… 以获得一些灵感?

标签: android architecture realm


【解决方案1】:

经过一番研究,我得出的结论是,在将 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

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2010-11-09
    • 1970-01-01
    • 2012-09-26
    • 1970-01-01
    • 2013-11-15
    • 1970-01-01
    • 2011-04-12
    • 2012-12-23
    相关资源
    最近更新 更多