关于android:Room Repository:按ID选择一行

 2021-04-09 

Room Repository: Selecting one row by ID

我正在尝试找出通过Room by ID获取单行的最佳方法。我已经从指南中复制了有关如何获取实体中所有行的代码(Workout以及所有连接的实体),这对于填充recyclerview非常有用。

但是当我现在只需要向下钻取一个时,我在存储库中的猜测代码是

1
2
3
4
@WorkerThread
suspend fun getWorkoutById(id: Long): LiveData<WorkoutTree> {
    return workoutDao.getWorkoutById(id)
}

和DAO

1
2
3
@Transaction
@Query("SELECT * FROM WORKOUTS WHERE id=:id")
fun getWorkoutById(id: Long): LiveData<WorkoutTree>

自然地,我从ViewModel调用repository.getWorkoutById(myId),所以我可以填充数据并从Activity / Fragment中引用它。

但是我试图弄清楚我是否走在正确的Rails上,并且是获取这一点的最佳方法。它是电话本地的数据库,因此坦白地说,这不应该是需要实时更新的问题。

最好只是序列化在Recyclerview中列出的所有行并将其传递到我的活动中,而不必费心通过ID来获取它呢?

我在网上找到的有关Room和Android开发的几乎所有示例都提供了获取所有行并使用LiveData的示例,并且存储库具有一个公共属性LiveData>,该属性由初始DAO从实体中获取的所有行的初始DAO填充。 >

我很难将这个示例从精神上转换成我只需要获取一行的示例。

我实际上没有任何可共享的功能代码,因为我无法真正弄清楚如何在Kotlin和Room等中构建该代码。我以前从未编写过Android应用程序,并且没有通过Python,JS,Scala编写函数式编程背景,因此对于Kotlin指南和Android指南如何建议您使用用于将所有内容分离的所有其他类和接口来做到这一点感到困惑电话应用程序。


按照惯例,您永远不要在只需要一部分数据时加载所有数据。
无论是桌面应用程序还是移动应用程序,您都应该始终加载所需的内容。
那说明您走在正确的Rails上。
由于您仅加载单行,因此不需要@Transaction批注。
除此之外,如果id@PrimaryKey(autoGenerate = true)的注释声明,则getWorkoutById应该可以正常工作。

如果您正在寻找有关Room的不错的教程,则可以进行此简短的免费教程
Android体系结构组件。
直接跳至第8课,因为它不依赖先前的课程。

如果您只想举一个例子,请看一下教程中的这个应用程序。更具体地说,请参见此处的DAO对象。
您将看到的完全是您所做的,只是它是用Java编写的。