1

私はAndroidアプリケーションにSOAアーキテクチャを使用しています。MYSQLデータベースからデータをフェッチしてSQLiteデータベースと同期するサービスをバックグラウンドで(1分ごとに)継続的に実行しています(2つのデータベースに変更がある場合)。

これで、サービスがバックグラウンドで実行されると、SQLiteが開きます。同時に、アプリケーションを処理(使用)している場合は、Sqliteを開いてデータをフェッチしようとします。その場合、次のようなエラーが発生します:データベースはandroid.database.SQLiteOpenHelper.getReadableDatabaseでロックされています。

このような状況で何ができるかを誰かに教えてもらえますか?

4

4 に答える 4

2

ここでContentProviderを使用することをお勧めします。

主にアプリケーション間での共有を目的としていますが、単一のアプリ内で使用できます。

コンテンツプロバイダーを使用すれば、dbを閉じたりロックしたりする心配はありません。

db操作についてはSimpleContentProviderを参照してください

于 2011-12-14T11:05:25.437 に答える
1

アプリとバックグラウンドサービスの間で単一のデータベース接続を共有する必要があります。これにより、データベースへのすべてのアクセスが正しくシリアル化されます。

于 2011-12-14T10:54:34.597 に答える
0

SQliteはファイルベースのデータベースであり、一度に1つのアプリケーションにのみアクセスを許可します。

  1. サービスをアプリケーションと同期する必要があるため、サービスはアプリケーションが新しいデータをフェッチするための時間を確保します(これには多くのソリューションがあります。セマフォ、モニター、ラウンドロビンを探してください)。

  2. サービスとアプリケーションからデータベースへのI/Oの要求を取得し、それらをキューに入れ、要求されたI / Oを実行し、要求を送信したアプリケーションまたはサービスに結果を返す2番目のサービスを使用します。

于 2011-12-14T10:58:39.540 に答える
0

それは真実ではありません。SQLite3は複数の接続をサポートしており、両方を開いたままにしておくことができます。必ず更新スレッドでトランザクションを使用し、できるだけ早く閉じてください。

これについてはhttp://www.sqlite.org/lockingv3.htmlをご覧ください。

Pythonを使用している場合は、たとえばtimeout、dbに接続するときにパラメータを設定できます。これにより、リーダースレッドがタイムアウト秒まで待機してからあきらめることができます。したがって、リーダーの人がタイムアウトしないように、アップデーターをできるだけコンパクトにすることが重要です。

http://docs.python.org/library/sqlite3.html

また、もっと知りたい方は、以下の本を強くお勧めします。SQLiteの決定的なガイド:http://www.apress.com/9781590596739

于 2011-12-14T11:07:43.573 に答える