callBatchTasks(来自 ORMLite)是否在单独的线程中运行?

问题描述 投票:0回答:2

我正在使用 ORMLite 来管理我的 Android 应用程序上的数据库,它运行得很好。但有时,当我尝试更新数据时,我会收到包含约束的异常。这个异常帮助我追踪到我正在调用 callBatchTasks()

此时实际上是一系列 3 个调用。第一个调用 2 更新 Table1 和 Table2。最后一次调用更新用于指定 Table1 和 Table2 之间的关系(因此具有约束)的表 (Table3)。这是获得例外的一个。

table1Dao.callBatchTasks(table1task);
table2Dao.callBatchTasks(table2task);
table3Dao.callBatchTasks(table3task);  // Exception here

由于任务实现了

callable
,我认为每个任务都在单独的线程上运行。因此,如果 table3task 领先于其他任务,它就会遇到约束问题。这是真的?如果是这样,建议的解决方法是什么,以便它们按顺序执行?

android ormlite
2个回答
4
投票

Dao.callBatchTasks(...)
与线程无关。所有 ORMLite 类的源代码都可以通过源 jar 或在线获取。查看 BaseDaoImpl.callBatchTasks(...) 源代码,它调用到
StatementExecutor.callBatchTasks(...)
,它:

  1. 关闭自动提交(使用 Android 事务)
  2. 调用作为参数传入
    Callable.call()
    callbatchTasks(...)
  3. 方法
  4. 恢复自动提交(关闭android事务)

如果您需要在另一个线程中运行它,那么您将必须分叉该线程并自己管理它。


0
投票

没关系,我发现了问题。这是一个线程的事情,但它符合我的逻辑。对同一更新任务的两次调用相继进行,创建了 2 个线程。当另一个已经插入数据时,一个会尝试将数据插入到 table3 中,这导致了错误。

看起来

callBatchTasks
并没有在自己的线程中运行,因为当我修复该问题时,它解决了错误。

© www.soinside.com 2019 - 2024. All rights reserved.