如何在存储库中访问LiveData模型的值

时间:2020-01-21 12:17:33

标签: java android android-livedata

我正在使用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。

我希望我描述的问题可以理解。

谢谢。

克里斯

3 个答案:

答案 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。