繁体   English   中英

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

[英]How can I access the value of my LiveData model in my respository

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

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

提前致谢。

克里斯

您可以按照下面的第二种方法进行操作:

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;
    }
}
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;
}

感谢您的回答。

但是如何将 LiveData 对象 (LiveData) 的实际值转换/分配给“普通”对象 (OrderModel)。

一方面我想像往常一样观察 LiveData,另一方面我也想直接从存储库外部访问 OrderModel 。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM