首页 > 解决方案 > Room Repository:按 ID 选择一行

问题描述

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

但是当我需要深入研究一个时,目前,我在存储库中的猜测代码是

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

在 DAO 中

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

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

但我试图弄清楚我是否走在正确的轨道上,以及获取这个的最佳方式。它是手机本地的数据库,所以老实说,不应该是需要实时更新的问题。

将在 Recyclerview 中点击的对象序列化并列出所有行并将其传递到我的活动中而不费心按 ID 获取会更好吗?

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

我很难将这个例子翻译成一个我只取一行的例子。

我真的没有任何功能代码可以分享,因为我真的不知道如何在 Kotlin 和 Room 等中构建它。我以前从未编写过 Android 应用程序,并且来自 Python、JS、Scala 的函数式编程背景,因此我正在努力解决 Kotlin 指南和 Android 指南建议您如何使用所有用于解耦一切的附加类和接口的方法。电话应用程序。

标签: androidkotlinandroid-room

解决方案


作为一种好的做法,您永远不应该在只需要其中一部分时加载所有数据。无论是桌面应用程序还是移动应用程序,您都应该始终只加载您需要的内容。那就是说你走在正确的轨道上。由于您只加载一行,@Transaction因此不需要注释。除此之外,如果id使用注释声明,@PrimaryKey(autoGenerate = true)getWorkoutById应该可以正常工作。

如果你正在寻找一个关于 Room 的好教程,你可以学习这个简短的免费教程 Android 架构组件。直接跳到第 8 课,因为它不依赖于前面的课程。

另一方面,如果您只是想要一个示例,请查看教程中的这个应用程序。更具体地看这里的 DAO 对象。您将看到这正是您所做的,只是它是用 Java 编写的。


推荐阅读