会议室存储库:按ID

时间:2019-05-01 04:58:27

标签: android kotlin android-room

我正在尝试找出通过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>

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

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

最好序列化Recyclerview中列出的所有行的对象并将其传递到我的活动中,而不必麻烦通过ID来获取?

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

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

我实际上没有任何可共享的代码,因为我真的不知道如何在Kotlin和Room等中进行架构。我以前从未编写过Android应用程序,并且来自通过Python,JS,Scala编写的函数式编程背景,因此对于Kotlin指南和Android指南如何建议您使用所有其他类和接口来实现此目的的做法感到困惑,手机应用程序。

2 个答案:

答案 0 :(得分:0)

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

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

另一方面,如果您只想举一个例子,请看this app from the tutorial。更具体地说,请看DAO对象here。 除了使用Java编写之外,您将看到的完全是您所做的。

答案 1 :(得分:0)

如果有人仍在搜索 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