android - 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 指南建议您如何使用所有用于解耦一切的附加类和接口的方法。电话应用程序。
解决方案
作为一种好的做法,您永远不应该在只需要其中一部分时加载所有数据。无论是桌面应用程序还是移动应用程序,您都应该始终只加载您需要的内容。那就是说你走在正确的轨道上。由于您只加载一行,@Transaction
因此不需要注释。除此之外,如果id
使用注释声明,@PrimaryKey(autoGenerate = true)
则getWorkoutById
应该可以正常工作。
如果你正在寻找一个关于 Room 的好教程,你可以学习这个简短的免费教程 Android 架构组件。直接跳到第 8 课,因为它不依赖于前面的课程。
另一方面,如果您只是想要一个示例,请查看教程中的这个应用程序。更具体地看这里的 DAO 对象。您将看到这正是您所做的,只是它是用 Java 编写的。
推荐阅读
- asp.net-core - 在 Asp.net Core 2.1 中使用 IActionFilter 进行 FluentValidation
- angular - 角度路由器:水平显示子级(作为兄弟姐妹)
- sql - 面向页面的嵌套循环连接 - 查询优化
- sql-server - 从 SSAS 数据源视图查看未显示在多维数据集分区下
- javascript - Jupyter Notebook:如何使用 Javascript 选择上一个单元格
- payment-gateway - payfast没有重定向到notify_url
- javascript - Javascript验证只允许字符串后跟数字
- java - 无法从 Android 应用程序连接到 localhost API
- jersey - com.sun.jersey.api.container.ContainerException : ResourceConfig 实例不包含任何根资源类
- spring-ws - 使用 wss4jsecurityinterceptor 进行 spring security- 使用两个密钥配置签名和加密的安全性