我正在学习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); }


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

我的问题是:为什么?

最佳答案

我使用Repository的原因有两个:


关注分离我让仓库负责下载和存储所有数据。这样,ViewModel不必知道有关数据来源的任何细节,例如如果来自API或缓存。这也使编写ViewModel的单元测试变得更加容易,因为所有数据库和API逻辑都应该已经在Repository的单元测试中进行了测试。
可重用性假设您从API提取数据并存储在数据库中。如果将代码放在ViewModel中,然后想从应用程序的其他位置执行相同的操作,则需要复制粘贴代码。通过将其放在Repository中,您可以轻松共享实现。
共享数据如果您有多个屏幕显示同一数据集的各个部分,则在屏幕之间传递一个Repository即可轻松共享数据。不再尝试在BundleIntent中传递大量数据。
生命周期假设您从API下载数据以在视图中显示。如果在ViewModel中获取数据,则在关闭并重新打开屏幕后必须重新下载,因为ViewModel被丢弃。但是,如果将其存储在Repository中,则可以使用Application生命周期,因此,当您再次访问该屏幕时,数据已经在缓存中。

07-25 23:39
查看更多