我正在学习 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); }
当我们不明白为什么时,这似乎是多余的。
我的问题是:为什么?
答案 0 :(得分:2)
出于几个原因,我使用Repository
:
关注点分离:我让仓库负责下载和存储所有数据。这样,ViewModel
不必知道有关数据来自何处的任何细节。如果来自API或缓存。这也使编写ViewModel
的单元测试变得更加容易,因为所有数据库和API逻辑都应该已经在Repository
的单元测试中进行了测试。
可重用性假设您从API提取数据并存储在数据库中。如果将代码放在ViewModel
中,然后想从应用程序的其他位置执行相同的操作,则需要复制粘贴代码。通过将其放在Repository
中,您可以轻松共享实现。
共享数据。如果您有多个屏幕显示同一数据集的各个部分,则在屏幕之间传递一个Repository
可以很容易地共享数据。无需再尝试在Bundle
和Intent
中传递大量数据。
生命周期,假设您从API下载数据以在视图中显示。如果您在ViewModel
中获取数据,则在关闭并重新打开屏幕后必须重新下载数据,因为ViewModel
被丢弃了。但是,如果将其存储在Repository
中,则可以使用Application
生命周期,因此,当您再次访问该屏幕时,数据已经在缓存中。