2011-08-05 9 views
3

私のアプリケーションでは、1つのサービスがサーバーからデータを取得しており、それをtable Aに挿入しています。HTC Desireのデータベースロックの問題

私が特定のUIに行くと、別のtable Bのデータをリストアップする必要があります。バックグラウンドが の場合、データベースロックされた例外が生成されます。私は2つの異なるテーブル上で並列に実行される2つのデータベース 操作を得ました。

samsung gt15801では正常に動作しています。しかし、htcの欲望は、データベースロック エラーを生成します。

HTCの要望挿入プロセスに要する時間は91秒です。

サムスンgt15801 - 挿入プロセスは21秒かかります。

+0

[this](http://notes.theorbis.net/2010/02/batch-insert-to-sqlite-on-android.html)メソッドを使用すると、挿入にかかる時間が短縮されます。 91秒 – DroidBot

答えて

14

は1 SqliteDatabaseHelperを使用して、それ単一のインスタンスにするために試してみてください。その後操作を完了した後にSqliteDatabaseインスタンスを閉じないでください

あなたは多くの同時操作を持つデータベースの操作を開始すると、あなたが

database.beginTransaction(); /* for start transaction */ 

、操作を完了した後に使用する必要があり、この

http://www.sqlite.org/lockingv3.html

を参照してくださいそのためのデータベースのロックを実装することができますあなたが使用できるデータベースで

database.setTransactionSuccessful();  
database.endTransaction(); 

しかし、トランザクション間でエラーが発生した場合は、トランザクションがロールバックされるようにdatabase.setTransactionSuccessful();を設定しないでください。

また、あなたは、あなたが他のトランザクションではないトランザクションである、それはtrueを返した場合、現在のデータベースがdatabase.inTransaction();によってトランザクション内にあるかどうか、エラー時に確認することができますまた、あなたがするかどうかを確認することができ

現在のデータベースがロックされているかどうかを問い合わせる

database.isDbLockedByCurrentThread(); 
database.isDbLockedByOtherThreads(); 

これはブール値を返します。

また、あなたは、あなたが複数のスレッドが削除されたメソッドの上

database.setLockingEnabled(boolean); 

によって、同時にデータベースを読み書きしようとしている場合は、データベースをロックするかどうかを設定することができますがそれほど使用しないでください推奨されていません。

+0

reply.soのためにありがとう、もし私がデータベース上で並行操作をしたいのであれば、LOCKを行う必要がありますか?ありがとう。 – DroidBot

+0

はいいいえ – Dharmendra

+1

'isDbLockedByOtherThreads()'は、常にfalseを返すので、使用しないでください。もはやデータベースロックの概念はありません。http://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() –

関連する問題