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

时间:2012-10-22 23:12:16

标签: android ormlite

我正在使用ORMLite在我的Android应用程序上管理我的数据库,它一直运行良好。有时候,当我尝试更新数据时,我会得到一个包含约束的异常。这个例外帮助我将它追溯到我打电话的地方callBatchTasks()

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

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

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

2 个答案:

答案 0 :(得分:3)

听起来你解决了问题,但我想我会回答更多信息。

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

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

答案 1 :(得分:0)

没关系,我发现了这个问题。这是一个线程化的事情,但这符合我的逻辑。正在对彼此进行两次相同更新任务的调用,创建了2个线程。当另一个已经拥有时,会尝试将东西插入table3,这会导致错误。

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