我正在使用Room,ViewModel和双向数据绑定。在这个简单的示例中,我需要从数据库中选择数据并进行验证。如果数据有效,则将其暴露给数据绑定。在另一种情况下,我必须从数据库中选择其他数据。
DAO:
@Dao
public interface IDAOQuestion {
@Query("SELECT * FROM Question WHERE questionId = :questionId")
Question selectQuestion(long qeustionId);
}
实体:
@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。这是因为在TypeConverter中使用了MutableLiveData.postValue,而不是该属性上存在的观察者。
作为解决方法,我可以创建没有LiveData的另一个实体(POJO类)并将其用于验证。之后,我可以重新选择数据或将其映射到对象的“ LiveData版本”。但这似乎太疯狂了,太复杂了。解决这个问题的正确方法是什么?
这只是简单的例子。逻辑仅用于说明。我了解为什么会这样。我也无法通过更改SELECT查询来解决此问题。另外,我还必须在属性上使用实时数据,因为我正在通过依赖属性的两种方式进行数据绑定。