我正在使用MVVM体系结构,存储库和Room数据库进行Android项目。因此,在我的存储库中,我从数据库中获取了一些数据,然后将LiveData对象返回给我的ViewModel。这是我的代码(非常简化):
public class Repository {
private final IDao mDao;
private OrderModel mOrderModel;
private LiveData<OrderModel> mOrderModelLiveData;
public Repository(Database database) {
mDao = database.dao();
mOrderModelLiveData= mDao.getOrderModel();
mOrderModel = new OrderModel();
}
public LiveData<OrderModel> getOrderModelLiveData() {
return mOrderModelLiveData;
}
}
如您所见,我有一个名为mOrderModel的字段。那么如何实现将名为mOrderModelLiveData的LiveData的实际值分配给mOrderModel?
一种选择是使用LiveData的getValue()方法。但这异步工作,并且可以返回NULL。第二个选项是添加一个新的DAO方法,该方法直接返回mOrderModel而不包含LiveData。但是mOrderModel
不会自动更新。还是我必须像这样使用Transformations.switchMap
:
Transformations.map(mDao.getOrderModel(), new Function<LiveData<OrderModel>>() {
@Override
public Object apply(OrderModel orderModel) {
mOrderModel = orderModel;
return null;
}
};
我已经看到一个使用observeForever
的示例,但是我不确定在没有生命周期的情况下观察LiveData是否是个好主意。
我的目标是在存储库中设置mOrderModel
字段,而不使用LiveData。
我希望我描述的问题可以理解。
谢谢。
克里斯
答案 0 :(得分:1)
您可以按照以下第二种方法进行操作:
public class Repository {
private final IDao mDao;
private OrderModel mOrderModel;
private MutableLiveData<OrderModel> mOrderModelLiveData;
public Repository(Database database) {
mDao = database.dao();
mOrderModel = new OrderModel();
mOrderModelLiveData = new MutableLiveData<>();
}
public void getData() {
mOrderModel = mDao.getOrderModel(); // Your dao should return model instead of livedata
mOrderModelLiveData.postValue(mOrderModel);
}
public MutableLiveData<OrderModel> getOrderModelLiveData() {
return mOrderModelLiveData;
}
}
答案 1 :(得分:0)
This will be placed in your repository.
public LiveData<OrderModel> getOrderModelLiveData() {
MutableLiveData<OrderModel> data = new MutableLiveData<>();
service.getOrderModelLiveData().enqueue(new Callback<OrderModel>() {
@Override
public void onResponse(Call<OrderModel> call, Response<OrderModel> response) {
ResponseObj body = response.body();
if (body != null ) {
data.postValue(body);
} else {
data.postValue(null);
}
}
@Override
public void onFailure(Call<MostResponse> call, Throwable t) {
data.postValue(null);
}
});
return data;
}
答案 2 :(得分:0)
感谢您的回答。
但是如何将LiveData对象(LiveData)的实际值转换/分配给“普通”对象(OrderModel)。
一方面,我想像往常一样观察LiveData,另一方面,我也想直接从存储库外部访问OrderModel。