Я использую 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.Также я должен использовать живые данные для своих атрибутов, потому что я использую их с двухсторонним связыванием данных с зависимыми атрибутами.