2013-04-18 3 views
5

私のAndroidアプリケーションでは、複数のSQLiteテーブルに異なるスレッド(1つのテーブルに挿入するスレッドと5つのテーブル)からデータを挿入する必要があります。 >setTransactionSuccessful() - - があり、私はbeginTransaction()使うので、多くのデータがあるすべてのスレッドで>endTransaction();をし、すべてのスレッドが同時に起動し、私は常にこの例外を得、時には第二または第三のスレッドで:私が使用データベースへの挿入時に現在のトランザクションがないため操作を実行できません

enter image description here

単一のSQLite接続(シングルトン)はmentioned hereでしたが、それにもかかわらずこの問題は残ります。私はいくつかの助けを願っています。

P.S競合状態がある場合は、マルチスレッド挿入に他の方法を使用する必要がありますか?

答えて

4

あなたの問題は競合状態だと思います。あなたが取引を開始し、終了している複数のスレッドを持っているので、次の操作のようなものかもしれません:

beginTransaction() 
// this may be a noop because a transaction is already open 
beginTransaction() 
setTransactionSuccessful() 
setTransactionSuccessful() 
endTransaction() 
// this may throw because the previous end closes the transaction 
endTransaction() 

を私はSqliteを単一の接続に開いて複数のトランザクションをサポートすることを考えていない、あなたが指摘するように、複数の接続は不可能です。

トランザクションの目的がデータの高速化である場合は、アーキテクチャを変更し、複数のスレッドから書き込む必要はありません。何らかのユーティリティクラスを使用して​​という実際のデータベース更新を行うことができます。これにより、すべてのスレッドがコールされ、トランザクションをいつ開くか閉じるかを決定します。別の考え方は、単一のスレッドにデータベース操作をさせ、他のすべてのスレッドは書き込みスレッドと共有するBlockingQueueに書き込みます。

+0

私は私の答え@AlexanderKaraberovにいくつかのアイデアを加えました。 – Gray

+0

実際のデータベースの変更を行うクラス(DAOのみ)があります。あなたのスレッドは単に 'insert()'などを呼び出すでしょう。メソッドは 'synchronized'となり、すでに開始されていなければトランザクションを開始する必要があるのか​​、すでに開始していればトランザクションを終了するのかを決定します。 – Gray

関連する問題