【问题标题】:How to get a callback when room completed deleting or adding of item?房间完成删除或添加项目时如何获得回调?
【发布时间】:2020-02-03 11:43:02
【问题描述】:

我想在 Room 完成删除或添加一些项目后立即发送请求。对于数据库,我使用房间 + livedata,但对于添加/删除项目,我使用 doAsync。项目删除/添加完成后如何获得回调?

添加/删除和进入我的数据库的示例

@Insert(onConflict = OnConflictStrategy.REPLACE)
fun saveUser(user: SavedUserModel)

@Query("SELECT * FROM SavedUserModel")
fun getUser(): List<SavedUserModel>

@Query("DELETE FROM SavedShoppingListModel WHERE id LIKE :id")
fun deleteById(id: String)

【问题讨论】:

  • “我使用 doAsync”——这是什么意思?由于您在 Kotlin 中,因此您可以切换到协程并让这些成为 suspend 函数。使用协程,您将不再需要回调,因为当那些 suspend 函数返回时,您会发现工作何时完成。
  • @CommonsWare 他只是想检查查询是否执行到我猜的最后。

标签: android android-room


【解决方案1】:

您可以从删除或更新中返回Int。该值将是受影响的行数。一旦通过简单的编程调用return,您就知道该方法的执行已经完成。查看this 线程以获取更多投票最多的答案。

或者,您可以使用Room + RxJava 并返回Completable 并在onComplete 方法中查找完成状态。这是 IMO 更甜的解决方案。但我猜第一个解决方案也行得通。

我认为,如果您还从选择查询中返回LiveData&lt;List&lt;T&gt;&gt;,则可以从房间中检测到您的删除。最后一个不太确定。

编辑:正如 cmets 中提到的@CommonsWare,您的另一个选择是协程。将方法标记为suspended,然后转到此答案的第 1 段。

【讨论】:

  • 谢谢,Int 返回帮助。是的,我知道 RX 和 Coroutines,但它是以前团队的遗留代码,现在没有时间或金钱进行重写
  • 嗯,总有时间做得更好。但是,很高兴我能帮上忙。总帐
猜你喜欢
  • 2013-06-21
  • 2014-05-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2023-04-01
  • 2016-01-06
  • 2018-05-18
相关资源
最近更新 更多