为什么ViewModel的对象不应该直接操作数据库?

时间:2019-11-29 06:49:05

标签: android design-patterns dao android-architecture-components

我正在学习 Android体系结构组件

例如,为了更易于理解,如果我要构建“待办事项清单”应用,则我的项目创建DAO应该为

@Dao
public interface ItemDao {
    @Insert
    long insertItem(Item item);
}

和我的viewModel可以使用此DAO在我的TODO列表中插入一个项目。 但是,在体系结构组件中,建议不要通过视图模型而是通过存储库来操纵数据库。

所以,代码应该像这样

public class ItemDataRepository {

    private final ItemDao itemDao;

    public ItemDataRepository(ItemDao itemDao) { this.itemDao = itemDao; }

    // --- CREATE ---

    public void createItem(Item item){ itemDao.insertItem(item); }

当我们不明白为什么时,这似乎是多余的。

我的问题是:为什么?

1 个答案:

答案 0 :(得分:2)

出于几个原因,我使用Repository

  • 关注点分离:我让仓库负责下载和存储所有数据。这样,ViewModel不必知道有关数据来自何处的任何细节。如果来自API或缓存。这也使编写ViewModel的单元测试变得更加容易,因为所有数据库和API逻辑都应该已经在Repository的单元测试中进行了测试。

  • 可重用性假设您从API提取数据并存储在数据库中。如果将代码放在ViewModel中,然后想从应用程序的其他位置执行相同的操作,则需要复制粘贴代码。通过将其放在Repository中,您可以轻松共享实现。

  • 共享数据。如果您有多个屏幕显示同一数据集的各个部分,则在屏幕之间传递一个Repository可以很容易地共享数据。无需再尝试在BundleIntent中传递大量数据。

  • 生命周期,假设您从API下载数据以在视图中显示。如果您在ViewModel中获取数据,则在关闭并重新打开屏幕后必须重新下载数据,因为ViewModel被丢弃了。但是,如果将其存储在Repository中,则可以使用Application生命周期,因此,当您再次访问该屏幕时,数据已经在缓存中。