gpt4 book ai didi

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

转载 作者:行者123 更新时间:2023-11-29 18:25:52 31 4
gpt4 key购买 nike

我正在学习 Android 架构组件

例如,为了更容易理解,如果我想构建一个 TO DO LIST 应用程序,我的项目创建 DAO 应该是

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

我的 viewModel 可以使用这个 DAO 在我的 TODO 列表中插入一个项目。但是,在架构组件中,建议不要通过 View 模型而是通过存储库来操作数据库。

所以,代码应该是这样的

public class ItemDataRepository {

private final ItemDao itemDao;

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

// --- CREATE ---

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

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

我的问题是:为什么?

最佳答案

我使用 Repository 有几个原因:

  • 关注点分离 我让 repo 负责下载和存储所有数据。这样,ViewModel 就不必知道有关数据来源的任何细节,例如如果它来自 API 或缓存。它还可以更轻松地为 ViewModel 编写单元测试,因为所有数据库和 API 逻辑都应该已经在 Repository 的单元测试中进行了测试。

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

  • 共享数据 如果您有多个屏幕显示同一数据集的各个部分,在屏幕之间传递一个 Repository 可以轻松共享数据数据。不再尝试在 BundleIntent 中传递大量数据。

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

关于android - 为什么 ViewModel 的对象不应该直接操作数据库?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59100000/

31 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com