获取实时数据的价值

时间:2019-06-16 19:22:33

标签: android android-room android-databinding android-architecture-components android-livedata

我正在使用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查询来解决此问题。另外,我还必须在属性上使用实时数据,因为我正在通过依赖属性的两种方式进行数据绑定。

0 个答案:

没有答案