Как я могу получить доступ к значению моей модели LiveData в моем репозитории - PullRequest
1 голос
/ 21 января 2020

Я работаю над проектом Android с использованием архитектуры MVVM, репозиториев и базы данных Room. Поэтому в моем репозитории я извлекаю некоторые данные из базы данных и возвращаю объект 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. Так как же добиться назначения фактического значения LiveData с именем mOrderModelLiveData для mOrderModel?

Один из вариантов - использовать метод getValue () LiveData. Но это работает асинхронно и может возвращать 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 ]

1 голос
/ 21 января 2020

Вы можете следовать второму подходу, как показано ниже:

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;
    }
}
0 голосов
/ 21 января 2020

Спасибо за ваш ответ.

Но как я могу преобразовать / присвоить фактическое значение объекта LiveData (LiveData) «нормальному» объекту (OrderModel).

На одном С другой стороны, я хочу наблюдать за LiveData как обычно, а с другой стороны, я также хочу получить доступ к OrderModel напрямую из-за пределов хранилища.

0 голосов
/ 21 января 2020
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;
}
...