【发布时间】:2019-01-04 18:19:42
【问题描述】:
我正在分析 Android 架构组件示例应用 (BasicSample)。如果只附加了一个源,他们为什么在DataRepository 类中使用MediatorLiveData?
mObservableProducts = new MediatorLiveData<>();
mObservableProducts.addSource(mDatabase.productDao().loadAllProducts(),
productEntities -> {
if (mDatabase.getDatabaseCreated().getValue() != null) {
mObservableProducts.postValue(productEntities);
}
});
我认为他们应该只使用来自 DAO 的 LiveData<List<ProductEntity> 并使用 getter 方法来促进它:
public LiveData<List<ProductEntity>> getProducts() {
return mDatabase.productDao().loadAllProducts();
}
他们如何处理其他 DAO 请求:
public LiveData<List<ProductEntity>> getProducts() {
return mObservableProducts;
}
public LiveData<ProductEntity> loadProduct(final int productId) {
return mDatabase.productDao().loadProduct(productId);
}
public LiveData<List<CommentEntity>> loadComments(final int productId) {
return mDatabase.commentDao().loadComments(productId);
}
public LiveData<List<ProductEntity>> searchProducts(String query) {
return mDatabase.productDao().searchAllProducts(query);
}
同样的问题与ProductListViewModel 有关。他们再次仅使用一个来源创建了MediatorLiveData。
mRepository = ((BasicApp) application).getRepository();
LiveData<List<ProductEntity>> products = mRepository.getProducts();
// observe the changes of the products from the database and forward them
mObservableProducts.addSource(products, mObservableProducts::setValue);
【问题讨论】:
-
您错过了他们在将初始数据插入数据库之前有意过滤 DAO 排放。这就是您提到的 MediatorLiveData 所做的。
-
Aaa OK :) 因此,如果我在第一次运行时不向数据库插入任何数据,我可以确定数据库是在第一次查询之前创建的,因此我可以使用标准
public LiveData<List<ProductEntity>> getProducts() { return mDatabase.productDao().loadAllProducts(); }而无需创建Mediator? -
是的,那么您可以在没有中介的情况下使用标准 dao ;) 从技术上讲,如果您没有进行中介舞,您可以先准备一个空视图,然后在数据加载时加载数据由于 LiveData Room 集成而插入。这样调解员甚至都不是绝对必要的。
标签: android android-livedata android-architecture-components