【问题标题】:Room Repository: Selecting one row by IDRoom Repository:按 ID 选择一行
【发布时间】:2019-05-01 04:58:26
【问题描述】:

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

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

@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>

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

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

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

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

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

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

【问题讨论】:

  • @Query("SELECT * FROM WORKOUTS WHERE id=:id LIMIT 1") ?
  • ID 是唯一的。我更多的是询问dao和repo和Viewmodel之间的联系,如何传递结果。
  • 我应该返回实时数据吗?单身的?可能是?我的 repo 通过 id 获取是否应该返回一个对象,或者 void 并且有一个属于 repo 类的可变对象,当你通过 id 获取时它会更新?这是我的问题:建筑
  • @user1713450 你找到正确的方法了吗?请给我们一个答案。

标签: android kotlin android-room


【解决方案1】:

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

如果您正在寻找有关 Room 的优秀教程,您可以阅读这个简短的免费教程 Android Architecture Components。 直接跳到第 8 课,因为它不依赖于之前的课程。

另一方面,如果您只是想要一个示例,请查看this app from the tutorial。更具体地说,查看 DAO 对象here。 您会看到这正是您所做的,只不过它是用 Java 编写的。

【讨论】:

  • 示例显示:@Query("SELECT * FROM task WHERE id = :id") TaskEntry loadTaskById(int id);它不返回单个 LiveData 记录。所以看起来答案不是对单个记录使用实时数据,对吗?
  • 为什么说它不会返回一行?如果 Id 是唯一的,它应该只返回一行...
  • 单个 LiveData 记录。它返回一个对象,这很好。我认为最初的问题是返回单条记录的最佳方式。在这方面,我遇到了 LiveData 的挑战。我喜欢它用于列表,但不是真的用于单个记录,特别是如果我正在执行一系列操作。我很高兴该示例显示了为单个记录查询返回的 pojo。
【解决方案2】:

如果有人仍在搜索 limit offset 在房间里工作正常 + 额外的 where 条件

@Query("SELECT * FROM ziyaret WHERE uniq= :mUniq LIMIT :limit OFFSET :offset")
    fun getFirstColumn(mUniq: Long, limit: Int, offset: Int): List<Ziyaret>



var first = ziyaretDao.getFirstColumn(myUni, 1, 0) as ArrayList<Ziyaret>

(..,1,0) 它将返回表格的第一行,你可以设置范围thx to

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-07
    • 1970-01-01
    • 2016-05-18
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多