Получить значение живых данных - PullRequest
0 голосов
/ 16 июня 2019

Я использую Room, ViewModel и двустороннюю привязку данных.В этом простом примере мне нужно выбрать данные из базы данных и проверить их.Если данные действительны, тогда подвергните их привязке к данным.В другом случае я должен выбрать другие данные из базы данных.

DAO:

@Dao
public interface IDAOQuestion {
    @Query("SELECT * FROM Question WHERE questionId = :questionId")
    Question selectQuestion(long qeustionId);
}

Entity:

@Entity
public class Question {
    @NonNull
    @PrimaryKey(autoGenerate = true)
    private long questionId;

    @NonNull
    private MutableLiveData<Integer> correct = new MutableLiveData<>();

    public int getCorrectValue() {
        return correct.getValue() == null ? 0 : correct.getValue();
    }
}

ViewModel

public class QuestionViewModel extends AndroidViewModel {
    public LiveData<Question> mLDQuestion = new MutableLiveData<>();

    public void getQuestion(int questionId) {
        //pseudo DAO access
        Question question = IDAOQuestion.selectQuestion(questionId);

        //here it is always true (question.getCorrectValue() returns 0)
        if(question.getCorrectValue() == 0) {
            getQuestion(questionId + 1);
        } else {
            mLDQuestion.setValue(question);
        }
    }
}

Также у меня есть конвертер типов для преобразования int из базы данных в LiveData сущности.

public class LiveDataIntegerTypeConverter {

    @TypeConverter
    public static int toInteger(LiveData<Integer> value) {
        if (value == null || value.getValue() == null) {
            return 0;
        } else {
            return value.getValue();
        }
    }

    @TypeConverter
    public static MutableLiveData<Integer> toObservable(int value) {
        MutableLiveData<Integer> liveData = new MutableLiveData<>();
        liveData.postValue(value);
        return liveData;
    }
}

В ViewModel в функции getQuestion у меня есть некоторая «проверка».Это не работает правильно.код question.getCorrectValue() всегда возвращает 0. Это связано с использованием MutableLiveData.postValue в TypeConverter и отсутствием наблюдателя в свойстве.

В качестве обходного пути я могу создать другую сущность (класс POJO) без LiveData и использовать ее дляПроверка.После этого я могу повторно выбрать данные или сопоставить их с «версией LiveData» объекта.Но это кажется сумасшедшим и слишком сложным.Какой правильный подход для решения этой проблемы?

Это просто простой пример.Логика только для иллюстрации.Я понимаю, почему это происходит.Также я не могу решить эту проблему, изменив мой запрос SELECT.Также я должен использовать живые данные для своих атрибутов, потому что я использую их с двухсторонним связыванием данных с зависимыми атрибутами.

...