【问题标题】:Deleting data from table synchronously using Room in android在android中使用Room同步从表中删除数据
【发布时间】:2020-03-06 00:29:41
【问题描述】:

我需要同步删除表中的所有数据,然后插入新数据。

根据文档,@Query 异步运行,因此以下方法尚未完成删除数据,我们开始在下一行插入数据,这会导致崩溃。

@Query("DELETE FROM myTable") void deleteAll();

有什么方法可以同步删除吗?我们应该将使用 Query 注释的方法的返回类型从 void 更改为 int 还是应该使用 RoomDatabase.clearAllTables() 方法。 不确定 void clearAllTables () 是否也同步运行。

【问题讨论】:

  • 这不是空间,但 android 本身不会允许任何阻塞 UI 的任务。所以一切都需要在后台线程上完成。顺便问一下,为什么需要同步呢?没有人喜欢他们的应用程序滞后或挂起!
  • 我们已经在后台线程中调用了这些操作。 Room 总是在调用线程中进行操作。正如我所说,我们希望在输入更新数据之前删除以前的数据
  • “根据文档,@Query 异步运行”——仅当您返回反应类型时(例如,SingleLiveData)。否则,它会同步运行。 “所以下面的方法还没有完成删除数据,我们开始在下一行插入数据,这会导致崩溃”——我怀疑这里还有其他问题。
  • AFAIK, clearAllTables() 同步运行。但是,它会清除 所有 表,而您的 @Query 只会清除一个。
  • 在房间 2 中,您可以只运行查询异步,并将已删除的项目计为结果。之后插入项目。

标签: android android-room


【解决方案1】:

在房间 2 中,您可以只运行查询异步,并将已删除的项目计为结果。之后插入项目。

【讨论】:

    【解决方案2】:

    如果你叫 dao 喜欢

    someDao.deleteAll()
    someDao.insert(someObj)
    

    您没有任何保证 deleteAll 将在开始插入命令之前完成。 要使其在链中,只需为 deleteAll() 添加 dao 返回参数

    @Query("DELETE FROM table")
    fun deleteAll(): Int
    

    现在 Room/SQLite 将完成删除调用以向您返回值。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-06
      • 2019-11-21
      • 2018-06-21
      • 2020-12-28
      相关资源
      最近更新 更多