问题描述
现在,我在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>>
。
哪种方法更好?
解决方法
您应该考虑两个因素:
- 与数据库的所有交互(包括查询和更新)都应在主线程之外。
- 在某些用例中,您希望进行一次“一次性”查询,而在另一些情况下,您希望查询是“实时”的,即,只要数据发生更改(观察者模式),就返回更新的结果。
使用Kotlin,您有两个主要选择(更好的选择就是品味问题。在某些教程中,您还可以看到AsyncTask或Thread executor用于关闭主线程):
- 使用RxJava(对
查询使用 Flowable ,对 一次性查询使用 Single -和 Single / Completable / Maybe (用于插入/更新/删除)。使用RxJava,您可以使用内置机制关闭主线程。 - 使用协程(和关键字
suspend
)进行插入/更新/删除,并使用 LiveData 或 Flow (来自协程库)进行“实时”查询,或suspend
-用于“一次性”查询。suspend
允许从主线程切换。如果您使用LiveData / Flow,则不需要suspend
,因为Room会自己执行。