【问题标题】:What approach should I use in the DAO to manipulate data in a database using Room?我应该在 DAO 中使用什么方法来使用 Room 操作数据库中的数据?
【发布时间】:2020-09-17 09:49:56
【问题描述】:

现在我在我的 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&lt;List&lt;Notes&gt;&gt; 而不是 List&lt;Notes&gt;LiveData&lt;List&lt;Notes&gt;&gt;。 哪种方法更可取?

【问题讨论】:

    标签: android kotlin android-room rx-java2 android-livedata


    【解决方案1】:

    您应该考虑两个因素:

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

    使用 Kotlin,您有两个主要选择(更好的是个人喜好。在一些教程中,您还可以看到 AsyncTask 或线程执行器用于关闭主线程):

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

    有关其他提示,另请参阅 official documentation

    【讨论】:

    • 谢谢,现在我明白了。但是 Flowable 和 LiveData(或 Flow)是否具有相同的性能?还是在这种情况下没关系?
    • 更多的是你选择在项目中使用的堆栈,通常用于异步工作(数据库、网络等)。决定是固执己见的。在上一期 Google 的教程中,他们在 Dao 中使用了 Flow,在 ViewModel 中他们将其变成了 LiveData。但没有人说这是唯一也是最好的方法。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2012-06-19
    • 1970-01-01
    • 1970-01-01
    • 2020-02-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多