23

2つの部分からなるアプリケーションがあります。

  • コンテンツを作成するサービス。
  • コンテンツを使用するアプリケーション

これらはそれぞれ異なるプロセスとして実行されます。問題は、両方がデータベースを共有していることです。また、サービスが何かを書き込もうとしたときとUIがデータを読み取っているときの両方で、データベースロックエラーが頻繁に発生します。また、その逆も同様です。これについてはどうしますか?

  • DBへのアクセスに使用されるクラスはシングルトンクラスです。しかし、UIとサービスの両方が2つの異なるプロセスであるため、私が推測する2つのシングルトンがあります。だからそれは助けにはならない。
  • 2つの異なるプロセスがあるため、私が推測するのにもsynchronise役立ちません。
  • Content Providersオプションかもしれませんが、私は複雑なクエリを使用して情報を掘り下げるので、それを使用するのも非常に難しいでしょう。

2つのプロセスでデータベースを共有するにはどうすればよいですか。どんな手がかりも大歓迎です。

4

4 に答える 4

8

コンテンツプロバイダーの使用は1つのオプションです。もう1つは、BerkeleyDBを確認することです。BDB SQL APIはSQLiteと互換性があり、BDBロックマネージャーを使用すると、複数のスレッドやプロセスがデータベースに対して同時に読み取り/書き込みを行うことができます。

于 2011-03-10T20:31:42.757 に答える
3

各操作の後に接続を閉じます

データベースロックエラーをキャッチし、50ミリ秒後に再接続を試みます

または、サービスにデータベースを処理させ、アクティビティがサービスにデータを要求します

isDatabaseInUseMethodがあるかもしれませんか?

于 2011-03-09T21:15:15.860 に答える
1

コンテンツプロバイダーを使用して、データベースクエリを1つのソースに集中させる必要があります。コンテンツプロバイダーの内部では、同時アクセスがないようにするために、任意のロックメカニズムを使用できます。また、コンテンツオブザーバーを使用して、サービスアクションとデータベースの変更を調整することも考えられます。

于 2011-03-09T21:52:37.980 に答える
0

以下は、Android上のSQLiteでロックがどのように機能するか、および注意すべき点についての優れた記事です:http: //kagii.squarespace.com/journal/2010/9/10/android-sqlite-locking.html

私はあなたがそこにいくつかの答えを見つけると思います:)

于 2011-03-09T15:55:35.843 に答える