2

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

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

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

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

4

2 回答 2

3

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

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

  1. 关闭自动提交(使用 android 事务)
  2. 调用Callable.call()作为参数传入的方法callbatchTasks(...)
  3. 恢复自动提交(关闭android事务)
于 2012-10-23T16:51:56.867 回答
0

没关系,我发现了问题。这是一个线程的事情,但这是我的逻辑。对同一个更新任务的两次调用紧随其后,创建了 2 个线程。一个人会在另一个人已经拥有的时候尝试将东西插入到 table3 中,这会导致错误。

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

于 2012-10-23T05:33:07.287 回答