RealmDb:在Android中的清洁架构

5

我正在评估 RealmDb,感觉 RealmDb 与模型层紧密耦合。这让我感觉如果明天需要替换为其他本地数据库,那么将需要进行大量重构。
我的问题是如何在 RealmDB 中实现干净的架构?是否有可以参考的示例?

2个回答

2
有不同的架构,主要目标是将我们应用程序的领域与Clean Architecture、Onion Architecture、Hexagonal Architecture等框架隔离开来。
为了实现这种隔离,实现细节被隐藏在数据层中。在领域层中定义了一个边界或端口,定义了如何访问存储的数据,但不知道它们是如何存储的,通常使用仓库模式来实现这种架构需求。
根据这些要求,我们通常会有一个持久性模型和一个不同的领域实体。持久性模型可以和我们使用的框架(例如Realm)耦合。
我留下了一张图表,您可以更好地理解它的图形化表示。 Clean Architecture

2

如果您愿意,Realm可以使您更轻松地将数据库模型作为视图模型进行重用。但是,没有什么能阻止您在数据层实体和视图层实体之间进行映射。

例如:

// Data layer
public class FooEntity extends RealmObject {

  // Realm fields and methods... 

  public static FooEntity fromViewModel(FooViewModel viewModel) {
    // Convert to entity
  }

  public static FooViewModel toViewModel(FooEntity entity) {
    // Convert to view model
  }


}

// View layer
public class FooViewModel {
  // Standard POJO used by the View layer
}

在许多情况下,这很可能是过度的,但它会给你想要的分离。

我不确定我的理解是否正确,这是否意味着我的数据层实体需要继承自RealmObject? - Signcodeindie
是的,因为它将是您的数据层负责保存和存储 Realm 数据。 - Christian Melchior
采用这种方法,更新已持久化的模型的最佳实践是什么?我可以只调用 fromViewModel 并执行 realm.insert(fooEntity) 吗?还是我需要先执行 findById,然后在事务内调用检索到的对象上的设置器? - einsA
这完全取决于您的用例。您可以执行 realm.copyToRealmOrUpdate(DBModel.from(viewModel)) 或使视图层创建小的操作消息,模型层将把它们转换为仅调用几个字段的setter。就我个人而言,我喜欢更小的操作,因为它使代码的意图更易读,并允许您合并来自UI和网络的更改,但这也需要稍微多做一些工作。 - Christian Melchior
@einsA 你需要调用realm.insertOrUpdate(fooEntity)insert()不能用于更新。 - EpicPandaForce

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