私のアプリは、Android ContentResolver が処理できない結合やその他のものを使用して、いくつかの非常に複雑なクエリを実行します。これらのクエリ、挿入などの一部は UI スレッドをブロックする可能性があるため、バックグラウンドで実行します。ご想像のとおり、これにより、2 つの SQL 要求のタイミングが互いに一致すると、SQLiteException (データベースがロックされている) が発生する可能性があります (これの最も一般的な原因は、ユーザーが表示を要求している間に、バックグラウンドでサーバーからデータベースにデータをロードすることです)画面上のデータベースからのデータ)。
この問題を修正する最善の方法は、すべての DB アクティビティを 1 つのスレッドに保持することですが、上で述べたように、特に挿入によって UI スレッドのブロックが長時間発生する可能性があるため、これは現実的ではありません。私が見た他のオプションは、ContentResolver のすべてのメソッドを同期することです (それらはすべて、DatabaseHelper のような共通のメンバー変数を共有する必要があります)。私はこれを行いましたが、これでも十分ではありません。一部のメソッドでは、SQLiteDatabase オブジェクトの rawQuery() メソッドを使用して、データを取得する必要がある sql を実行する必要があるためです。
ContentResolver メソッドと SQLiteDatabase メソッドの両方を同期するために使用できる戦略を知っている人はいますか? どうもありがとう!