2

私はAndroidアプリでデータベースを管理するためにORMLiteを使用していますが、それはかなりうまく機能しています。ただし、データを更新しようとすると、制約に関する例外が含まれる場合があります。例外は、callBatchTasks()を呼び出している場所まで追跡するのに役立ちました。

それは実際にはその時点での一連の3回の呼び出しです。最初の呼び出し2は、Table1とTable2を更新します。最後の呼び出しは、Table1とTable2の間の関係を指定するために使用されるテーブル(Table3)を更新します(したがって、制約があります)。これは例外を取得するものです。

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

タスクが実装されcallableているので、それぞれが別々のスレッドで実行されると思います。したがって、table3taskが他のタスクよりも進んでいる場合、制約の問題が発生します。これは本当ですか?もしそうなら、それらが順番に実行されるように推奨される回避策は何ですか?

4

2 に答える 2

3

問題を解決したようですが、もっと詳しい情報でお答えしたいと思います。

Dao.callBatchTasks(...)スレッドとは何の関係もありません。すべてのORMLiteクラスのソースは、ソースjarまたはオンラインから入手できます。を呼び出すBaseDaoImpl.callBatchTasks(...)のソースを見ると、次のようStatementExecutor.callBatchTasks(...)になります。

  1. 自動コミットをオフにします(Androidトランザクションを使用)
  2. Callable.call()の引数として渡されるメソッドを呼び出しますcallbatchTasks(...)
  3. 自動コミットを復元しました(Androidトランザクションを閉じます)
于 2012-10-23T16:51:56.867 に答える
0

気にしないでください、私は問題を見つけました。それはスレッド化されたものでしたが、それは私の論理の中にありました。同じ更新タスクへの2つの呼び出しが次々に行われ、2つのスレッドが作成されていました。一方はもう一方がすでに持っているときにtable3に物を挿入しようとしましたが、これがエラーの原因でした。

callBatchTasksその問題を修正したときにエラーが解決されたため、独自のスレッドでは実行されないようです。

于 2012-10-23T05:33:07.287 に答える