我应该在DAO中使用哪种方法来使用Room操作数据库中的数据?

问题描述

现在,我在DAO中使用以下代码:

@Dao
interface NotesDao {

    @Query("SELECT * FROM Notes")
    fun getAllNotes(): List<Notes?>?

    @Query("SELECT * FROM Notes WHERE not hidden AND not grouped")
    fun getNotes(): List<Notes?>?

    @Query("SELECT * FROM Notes WHERE id = :id")
    fun getById(id: Long): Notes?

    @Insert(onConflict = OnConflictStrategy.REPLACE)
    fun insert(notes: Notes?)

    @Update
    fun update(notes: Notes?)

    @Delete
    fun delete(notes: Notes?)
}

但是在许多教程中,我看到的是Flowable<List<Notes>>而不是List<Notes>LiveData<List<Notes>>。 哪种方法更好?

解决方法

您应该考虑两个因素:

  1. 与数据库的所有交互(包括查询和更新)都应在主线程之外。
  2. 在某些用例中,您希望进行一次“一次性”查询,而在另一些情况下,您希望查询是“实时”的,即,只要数据发生更改(观察者模式),就返回更新的结果。

使用Kotlin,您有两个主要选择(更好的选择就是品味问题。在某些教程中,您还可以看到AsyncTask或Thread executor用于关闭主线程):

  1. 使用RxJava(对查询使用 Flowable ,对一次性查询使用 Single -和 Single / Completable / Maybe (用于插入/更新/删除)。使用RxJava,您可以使用内置机制关闭主线程。
  2. 使用协程(和关键字suspend)进行插入/更新/删除,并使用 LiveData Flow (来自协程库)进行“实时”查询,或suspend-用于“一次性”查询。 suspend允许从主线程切换。如果您使用LiveData / Flow,则不需要suspend,因为Room会自己执行。

另请参阅official documentation

相关问答

Selenium Web驱动程序和Java。元素在(x,y)点处不可单击。其...
Python-如何使用点“。” 访问字典成员?
Java 字符串是不可变的。到底是什么意思?
Java中的“ final”关键字如何工作?(我仍然可以修改对象。...
“loop:”在Java代码中。这是什么,为什么要编译?
java.lang.ClassNotFoundException:sun.jdbc.odbc.JdbcOdbc...