1

私は自分のアプリで頻繁に使用される SQLite データベースを持っています。次からアクセスします。

  • ASyncTasks を介して UI にデータをロードするためのさまざまなアクティビティ (select ステートメントのみ)
  • 多くの挿入/更新を行う複数のバックグラウンド プロセス (一度に実行できるプロセスは 1 つだけ)

getWritableDatabase() を 1 回呼び出すと、これをどこでも使用できます。バックグラウンド プロセスのそれぞれは IMMEDIATE (つまり、非ロック) トランザクションを使用します。これにより、一部のプロセスが数分から数秒に高速化されます。

これはすべて、ジェリービーン以前は完全に機能していました。バックグラウンド プロセスにはトランザクションの速度の利点がありましたが、Activite が ASyncTasks を介してデータをロードすることをブロックしませんでした。

Jellybean の後、GUI のデータをロードする各 ASyncTask は、トランザクションの進行中にブロックされるため、数秒間戻らないことがよくあります。これにより、ナビゲーションが遅くなり、イライラします。ブロッキングを rawQuery データベース呼び出しに分離しました。

廃止されたいくつかのメソッドを除いて、ジェリービーンで何が変更されたかを正確に指定するドキュメントが見つかりません-http ://developer.android.com/reference/android/database/sqlite/SQLiteDatabase.html#isDbLockedByOtherThreads() -コメント付き「データベース ロックの概念がなくなったため、このメソッドは常に false を返します。」

ジェリービーン以前の動作を模倣する簡単な方法はありますか?

4

2 に答える 2

1

私は自分の質問に対する解決策を見つけました。Google が Jellybean で何を変更して、現在動作する前に機能していたものを停止したかはまだ正確にはわかりませんが、解決策はenableWriteAheadLogging()を使用することです。

以前にこれを試してみましたが、役に立ちませんでした-トランザクションの進行中にまだ読み取りがブロックされていました。私にとって重要な部分は( enableWriteAheadLogging() ドキュメントで)

データベースにデータベースが接続されている場合、クエリを並列で実行することはできません。

残念ながら、私のアプリケーションには 2 つの別個のデータベースがあり、結合されたクエリを許可するために一緒に接続されています - enableWriteAheadLogging() は false を返します。添付ファイルを削除するプロトタイプを作成しました。これにより、ブロックの問題が解決されます。別のスレッドが IMMEDATE トランザクションを実行している間、私の選択クエリはすべて遅延なく実行されます。

残念ながら、完全な修正を実装するには、データベース スキーマを再設計する必要があります。

于 2013-04-29T13:15:25.650 に答える