2012-10-22 60 views
2

我使用ORMLite來管理我的數據庫在我的Android應用程序,它一直工作得很好。有時候,當我嘗試更新數據時,我會得到一個包含約束約束的異常。這個例外幫助我追溯到我撥打callBatchTasks()的地方。CallBatchTasks(來自ORMLite)是否在單獨的線程中運行?

這實際上是在這一點上的一系列3個電話。第一次調用2更新Table1和Table2。最後一次調用更新一個表(表3),該表用於指定Table1和Table2之間的關係(因此具有約束)。這是得到例外的那個。

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

由於任務執行callable我想每個都在一個單獨的線程上運行。所以如果table3任務超過其他任何一個,它會遇到一個約束問題。這是真的?如果是這樣,建議的解決方法是什麼,以便它們按順序執行?

回答

3

聽起來像你解決了你的問題,但我想我會回答更多的信息。

Dao.callBatchTasks(...)與線程無關。所有ORMLite類的源都可以通過源代碼jar或在線獲得。看着它通過給StatementExecutor.callBatchTasks(...)調用source for BaseDaoImpl.callBatchTasks(...),它:

  1. 關閉自動提交(使用的是Android交易)
  2. 呼叫傳遞中作爲參數callbatchTasks(...)
  3. 恢復汽車的Callable.call()方法 - 提交(關閉安卓交易)
+1

這就是我想的(在找出我的問題後)。無論如何,謝謝你的迴應!我將它標記爲答案,因爲它實際上回答了問題 – compuguru

0

沒關係,我發現了這個問題。這是一個線程化的東西,但它在我的邏輯中。兩個調用相同更新任務的調用正在緊挨着,創建2個線程。當其他人已經擁有時,會嘗試將其插入表3中,這會導致錯誤。

看起來好像callBatchTasks不會在它自己的線程中運行,因爲當我修復該問題時,它解決了錯誤。

相關問題