【问题标题】:MVVM/Room pulling a single item from the Dao or Repository, what is the best approach?MVVM/Room 从 Dao 或 Repository 中提取单个项目,最好的方法是什么?
【发布时间】:2020-01-28 12:59:52
【问题描述】:

我想使用 MVVM/Room 获取单个项目并在详细信息屏幕中对其进行编辑。我遵循了许多指南和示例来创建 MVVM/Room 应用程序。在其中许多中,Repository 类看起来像这样:

public class ScenarioRepository {

    private static final String TAG="ScenarioRepository";

    private ScenarioDao scenarioDao;
    private LiveData<List<Scenario>> allScenarios;


    public ScenarioRepository(Application application) {

        AppDatabase database = AppDatabase.getInstance(application);
        scenarioDao = database.scenarioDao();
        allScenarios = scenarioDao.getAllScenarios();
    }
    ....
}

这些示例侧重于填充 RecyclerView,并在编辑其中一条记录时将所有值从 RecyclerView 传递到编辑屏幕。记录中的信息通常比 RecyclerView 上显示的信息多,因此我更愿意从数据库中提取记录,并看到一些 MVVM 实现,其中 DAO 对这样的项目有特定调用:

@Query("select * from Scenario where id = :id")
Scenario getItembyId(int id);

在此示例中检索我想要的场景的最佳方法是什么?当 Repository 从构造函数中的 DOW 拉取完整的 Scenarios 列表时,为什么我需要获取单个项目?我是否应该在存储库中有一种方法从存储库中的成员变量 allScenarios 中提取场景,而不是返回到数据库/房间?

更新 我关注了these instructions,它很好地涵盖了主/细节场景。我像this video 一样扩展了 RecyclerView,这使得在 onItemClick 事件期间设置项目并将其传递给 ViewModel 以便细节片段可以轻松获取它。

【问题讨论】:

  • 您可以使用Transformations.map() 创建一个LiveData&lt;Scenario&gt;,该LiveData&lt;Scenario&gt; 根据您所需的ID 进行过滤,包装allScenarios LiveData。然后,当 Room 发出一个新的 List&lt;Scenario&gt;allScenarios 时,您的 Transformations.map() LiveData 也会发出一个从该列表中提取的 Scenario

标签: android android-room android-mvvm


【解决方案1】:

如果您不需要完整的数据列表而只需要单个项目,则按 id 过滤的查询很有用。

如果您仍然观察整个列表,但对于某些 UI 组件需要通过 id 获取项目,我建议您过滤该特定项目 id 的列表。

您可以通过问题中的查询来检索您的对象,或者如果您想观察数据库中的变化,请将其包装在 LiveData 中。

【讨论】:

  • 基本上我有两个片段,RecyclerView 和细节。这段代码专注于 RecyclerView。我可以更改存储库,以便在构造函数中不提取完整列表,并创建第二个成员变量 LiveData 从 DAO 中提取单个项目。这是你推荐的吗?
  • 我看到的每个示例都会在存储库的构造函数中提取完整列表。有些在 Dao 中显示单个项目的查询,但我从未看到它在存储库中实现。
  • 我建议你在这两个片段之间共享相同的视图模型实例,如果相同的活动托管它们,那么只需观察列表,如果单个项目发生变化,那么列表也会更新,所以您可以简单地观察列表并将其过滤为您需要的 itemId。
  • 好的。谢谢你。关于我应该从给定 ID 的 LiveData> 中获取特定场景的任何指导?我是 android 编程新手,可以参考专家意见来缩短学习周期。
  • 如果您在项目单击(片段 1)-> 项目详细视图(片段 2)上有类似 recyclerview 的内容,第一个片段将观察 LiveData 并将项目传递给 recyclerview 适配器,在第二个片段中,您还将观察列表,但将其过滤为特定 ID,并从具有该特定 ID 的列表中获取项目并显示它。
猜你喜欢
  • 2014-08-30
  • 1970-01-01
  • 1970-01-01
  • 2011-07-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2013-01-24
相关资源
最近更新 更多