【问题标题】:How can I access the value of my LiveData model in my respository如何访问存储库中实时数据模型的值
【发布时间】:2020-01-21 12:17:33
【问题描述】:

我正在开发一个使用 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。

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

提前致谢。

克里斯

【问题讨论】:

    标签: java android android-livedata


    【解决方案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;
        }
    }
    

    【讨论】:

    • 好的,这种方法看起来像我正在寻找的。谢谢你。但是我看到没有 LiveData 的 mDao.getOrderModel() 调用必须放在工作线程中,对吧?
    • 这取决于你的实现。最好在 ViewModel 中放置异步操作
    • 你也可以让你的getData()异步
    • 你好,我觉得让getData()异步是没有问题的,但是当我调用这个方法时,总是查询数据库。更好的方法是(对于我的实现),每当更新 LiveData 时,OrderModel 都会自动设置为实际的 LiveData 值。我怎么能意识到这一点?谢谢
    • 我仍然没有发现将模型与LiveData一起使用的任何意义,请您明确您的要求吗?
    【解决方案2】:
    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;
    }
    

    【讨论】:

      【解决方案3】:

      感谢您的回答。

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

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2020-12-03
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多