gpt4 book ai didi

android - 带有 Kotlin 协程的房间观察数据库变化

转载 作者:IT老高 更新时间:2023-10-28 13:44:25 25 4
gpt4 key购买 nike

所以,我最近开始使用协程进行实验,我从 Rxjava2 切换到协程,我还没有掌握它,但是我遇到了需要观察我的数据库更改并更新相应 UI 的情况到那个。

RxJava 曾经为我提供 Flowables、Completeable 等,使用它们我可以观察 Db 的变化。

    abstract fun insert(data: SomeData): Long

@Query("SELECT * FROM somedata_table")
abstract fun getData(): Flowable<List<SomeData>>

所以现在这里我以前订阅 getData 并且一直习惯于观察变化

现在进入协程,我正在使用一个带有延迟结果的挂起函数来返回我的响应

    @Insert(onConflict = OnConflictStrategy.IGNORE)
abstract fun insert(data: SomeData): Long

@Query("SELECT * FROM somedata_table")
abstract fun getData(): List<SomeData>
suspend fun getAllSomeData():Deferred<List<SomeData>>{
return GlobalScope.async (context= coroutineContext){
database.myDao().getData()
}
}

现在我无法收听更新,协程中的 Channels 可能是正确的答案?但我不确定如何在 Room 中使用它。

最佳答案

使用 Room 2.2.0 Flowskotlin 协程。这是有争议的,但我不喜欢 LiveData,因为它会在 UI 线程上为您提供结果。如果您必须进行任何数据解析,则必须将所有内容推回另一个 IO 线程。它也比直接使用 channels 更干净,因为您每次想要收听事件时都必须进行额外的 openSubscription().consumeEach { .. } 调用。

Flow方法需要以下版本:

//这个版本在他们的非实验版本中使用协程和流程

org.jetbrains.kotlinx:kotlinx-coroutines-android:1.3.2
androidx.room:room-runtime:2.2.0
androidx.room:room-compiler:2.2.0

道:

@Dao
interface MyDao {
@Query("SELECT * FROM somedata_table")
fun getData(): Flow<List<SomeData>>
}

上课观察:

launch {
dao.getData().collect { data ->
//handle data here
}
}

如果你的调用类本身不是一个CoroutineScope,你就必须在它的上下文中调用launch。这可以是 GlobalScope 或您创建的其他类。假设我们在一个 Activity 类中,我在这里使用了生命周期范围。

lifecycleScope.launch {
dao.getData().collect { data ->
//handle data here
}
}

collect lambda 将接收到表的每个更新,就像 Rx onNext 调用一样。

关于android - 带有 Kotlin 协程的房间观察数据库变化,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/54454829/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com