2011-02-06 15 views
2

私はしばらくの間実行されるIntentServiceを持つアプリを持っています。両方が一緒に実行されると、データベースに書き込むSQL文がお互いに行き渡ります(データベースがロックされたエラー)、アプリケーションがクラッシュしています。アクティビティとサービスが同時にどのようにDBに書き込むことができますか?

アクティビティとサービスの両方が同じデータベース接続を共有する方法はありますか?

+3

コンテンツプロバイダを使用してください。 – Falmarri

+0

コンテンツプロバイダを使用し、共有の 'SQLiteDatabase'を使用していることを確認してください。 ContentProviderはスレッドセーフではありません。ロックが行われていることを確認する必要があります(つまり、 'SQLiteDatabase'がそれを行うことを許可します)。 –

答えて

4
  1. Falmarriが示唆しているように、コンテンツプロバイダを使用することができます。

  2. 標準のJavaスレッド同期オプション(例:java.util.concurrent、​​キーワード)を使用してアクセスを同期させます。

  3. アクティビティは、データベースに書き込むべきではありません。アクティビティはIntentIntentServiceに送信し、と書いてください。

+0

私は完全に同意します。オプション3では、I/Oに時間がかかるときに気が利くこともありません。 NANDへの書き込みには長い時間がかかり(300ms程度)、アクティビティはその時間にユーザの入力に反応しません。 –

関連する問題