gpt4 book ai didi

android - 与 Livedata 不同,使用 Flow in Room 查询在更新表条目时不会触发刷新,但在我删除或插入条目时有效

转载 作者:行者123 更新时间:2023-12-05 02:42:31 29 4
gpt4 key购买 nike

当使用 Livedata 作为 Room 中表的 select* 查询的返回类型时,我观察到它,如果我更新/插入/删除该表中的条目,我会得到触发器。但是,当我尝试使用 Kotlin Flow 时,我只得到 2 个触发器。

第一个触发器给出空值,因为状态流的初始值为空。第二个触发器是 Room 表中的条目列表。

如果我在数据库上执行插入/删除操作,我会收到来自 StateFlow 的触发器。但是,如果我更新条目,Stateflow 不会触发。

注意:更新操作在数据库上正常工作。我使用数据库检查器进行了检查。

数据类和 DAO

@Entity
data class CartItem (
@PrimaryKey
val itemId: Int,
var itemQuantity: Int=1
)

@Dao
interface CartDao {

@Query("SELECT * FROM CartItem")
fun getAllItems(): Flow<List<CartItem>>

@Update
suspend fun changeQuantityInCart(cartItem:CartItem)

@Insert
suspend fun insert(item: CartItem)

@Delete
suspend fun delete(cartItem:CartItem)
}

View 模型

val cartItems: StateFlow<List<CartItem>?> =
repo.fetchCartItems().stateIn(viewModelScope, SharingStarted.Lazily, null)

fragment

viewLifecycleOwner.lifecycleScope.launchWhenStarted {
viewModel.cartItems.collect {
Log.e("Update","Update")
}

最佳答案

我的陷阱是我像这样更新对象:

 currentItem.itemQuantity = currentItem.itemQuantity + 1
changeQuantity(currentItem)

(currentItem 是类 CartItem 的对象,它最初是从 DAO 中的 getAllItems 流接收的。)

(changeQuantity fun 在 DAO 中调用 changeQuantityInCart fun。


这导致 StateFlow 中 CartItem 对象的引用在调用 DB 更新之前使用新的 itemQuantity 值保存对象的更新值。

之后,在DAO中调用Update fun时,DB entry被更新,Flow值发生变化,但是放入Stateflow中却没有检测到任何变化。因此,状态流不会触发,因为它是状态流与实时数据的不同之处。

如果是livedata,无论新值是否相同,都会触发。

因此,为了解决这个错误,在调用数据库更新操作之前不要更改 stateFlow 中对象的值,如下所示:

val updatedCartItem = cartItem.copy(itemQuantity = cartItem.itemQuantity + 1)
changeQuantity(updatedCartItem)

关于android - 与 Livedata 不同,使用 Flow in Room 查询在更新表条目时不会触发刷新,但在我删除或插入条目时有效,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/67572282/

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