【发布时间】: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<Scenario>,该LiveData<Scenario>根据您所需的ID 进行过滤,包装allScenariosLiveData。然后,当 Room 发出一个新的List<Scenario>到allScenarios时,您的Transformations.map()LiveData也会发出一个从该列表中提取的Scenario。
标签: android android-room android-mvvm