【发布时间】:2020-03-06 00:29:41
【问题描述】:
我需要同步删除表中的所有数据,然后插入新数据。
根据文档,@Query 异步运行,因此以下方法尚未完成删除数据,我们开始在下一行插入数据,这会导致崩溃。
@Query("DELETE FROM myTable")
void deleteAll();
有什么方法可以同步删除吗?我们应该将使用 Query 注释的方法的返回类型从 void 更改为 int 还是应该使用 RoomDatabase.clearAllTables() 方法。 不确定 void clearAllTables () 是否也同步运行。
【问题讨论】:
-
这不是空间,但 android 本身不会允许任何阻塞 UI 的任务。所以一切都需要在后台线程上完成。顺便问一下,为什么需要同步呢?没有人喜欢他们的应用程序滞后或挂起!
-
我们已经在后台线程中调用了这些操作。 Room 总是在调用线程中进行操作。正如我所说,我们希望在输入更新数据之前删除以前的数据
-
“根据文档,@Query 异步运行”——仅当您返回反应类型时(例如,
Single、LiveData)。否则,它会同步运行。 “所以下面的方法还没有完成删除数据,我们开始在下一行插入数据,这会导致崩溃”——我怀疑这里还有其他问题。 -
AFAIK,
clearAllTables()同步运行。但是,它会清除 所有 表,而您的@Query只会清除一个。 -
在房间 2 中,您可以只运行查询异步,并将已删除的项目计为结果。之后插入项目。
标签: android android-room