为了账号安全,请及时绑定邮箱和手机立即绑定

如何在安卓的视图模型中将数据从一个LiveData对象获取到另一个对象?

如何在安卓的视图模型中将数据从一个LiveData对象获取到另一个对象?

Smart猫小萌 2022-09-22 16:29:34

我正在尝试创建一个通过房间和实时数据使用SQL数据库的应用程序。这是一个非常非常简单的测验应用程序。将显示一个问题和几个可能的答案。此外,还有一个“下一个”和“上一个”按钮来浏览问题。

有两个表:“table_question”和“table_answer”。

table_question由以下列组成:id、问题

table_answer:id,答案,id_question

id_question分配问题的答案,因为它是 1:n 的关系。

我从数据库中获取所有问题和所有答案的列表,作为 LiveData 对象。另一方面,我希望有一个LiveData类QuizWorld,它处理在屏幕上显示所需的所有数据(回答的问题,正确回答的问题,错误回答的问题,留下的问题等等)。活动将观察此类,以便可以更新 UI。

但是,如何缩小两个实时数据列表“问题”和“答案”与创建实时数据测验世界之间的差距?QuizWorld 将需要保存在问题和答案中的信息,但 LiveData 对象没有构造函数。

我有使用转换.switchMap的想法,但我无法使它工作。即使我忘记了测验世界类并在ViewModel中执行所有操作,也会给我留下一个问题,即我无法访问实时数据列表。

注意:列表实际上不一定是 LiveData 对象,因为 SQL 数据库在运行时不会更改。我只是不知道如何通过房间访问数据库。但是,如果将来数据库变得更加动态,这仍然是一个不错的功能,这还没有计划。


查看完整描述

1 回答

?
摇曳的蔷薇

TA贡献1443条经验 获得超7个赞

我不完全确定你到底想要什么,但我宁愿建议你有一个对象问题与答案包含一个问题及其答案,而不是两个不同的列表。然后,您可以在 dao 类中进行查询,该查询将返回该 QuestionWiThAnswer 类(或您示例中这些对象的列表)

请参阅此链接以查询多个表(带有用户和宠物的示例应看起来像您的)在Dao类中,您将拥有类似以下内容的内容:

@Query("SELECT id as isQuestion, question, id as idAnswer, answer " +
      "FROM table_question " +
      "LEFT JOIN table_answer on table_question.id = table_answer.id_question")
      public LiveData<List<QuestionWithAnswer>> loadResults();

如果您希望通过一个查询直接将对象放在其他对象中,另请参阅此链接

或者,您可以进行转换,但我认为它不会非常有效,您会执行更多的SQL查询,这通常对性能不是很好(如果您有一个小数据库,您不会注意到它,但是对于具有更多数据的其他示例,您会注意到)。

编辑:

如果需要转换测验世界对象中的列表,可以使用变形.map 方法,如下所示:

quizWorldLiveData = Transformations.map(questionsWithAnswersLiveData, (data) -> new QuizWorld(data))



查看完整回答
反对 回复 2022-09-22

添加回答

举报

0/150
提交
取消
意见反馈 帮助中心 APP下载
官方微信