3

私は現在、同時実行をどのように処理するかをよりよく理解することを目的として、SQLiteDatabase と関連するクラスを調べています (私の現在のソリューションは機能しますが、同時実行が想定されているため、実際には冗長な作業を行っている可能性があるという印象を受けました)。は扱っていません)。

そうです、SQLiteOpenHelperのAndroidドキュメントについては、getWriteableDatabaseメソッドについて次のように述べています

正常に開くと、データベースがキャッシュされるため、データベースへの書き込みが必要になるたびにこのメソッドを呼び出すことができます。(データベースが不要になったら必ず close() を呼び出してください。)

何がキャッシュされているのかは少しわかりません(そのため、現在、キャッシュを実行するラッパーがあります)。それで、ここで何が起こっているのですか?2 つの SQLiteDatabase インスタンスは、キャッシュされた/静的なインスタンスのラッパーですか?

また、実際のロックはどのように処理されますか? 同じ SQLiteOpenHelper インスタンスによって作成された 2 つの別個の SQLiteDatabase インスタンスがある場合、これらはトランザクション上安全ですか? あるトランザクションで排他モードでトランザクションを開始し、別の SQLiteDatabase インスタンスで別のスレッドで別のトランザクションを開始した場合と同様に、最初のトランザクションが完了するまで 2 番目のトランザクションは開始されないと予想されます。これが仕組みですか?

4

2 に答える 2

3

「キャッシング」……そうですね。通常、(db を作成するための最後の呼び出し以降) 内部に格納されSQLiteOpenHelperている単一のオブジェクトがあるため、2 回呼び出すと、2 回目に同じオブジェクトが返されます (最初のインスタンスを閉じない限り、再度作成されます)。実際には、呼び出しはデータベースを r/w で開こうとし、それが失敗した場合にのみ読み取り専用インスタンスを返すことにフォールバックします。SQLiteDatabase#getWritableDatabase()#getReadableDatabase()

データベースのクローズと呼び出し#getWritableDatabase()はスレッドセーフではないことに注意してください。つまり、SQLiteOpenHelper多くのスレッドでデータベースをいじると、クローズされたデータベースが返される可能性があります。

要するに、SQLiteDatabase- のインスタンスを 1 つ持つことになりますが、SQLiteDatabase#setLockingEnabled(true).

于 2012-05-26T18:24:03.263 に答える
2

何がキャッシュされているのかは少しわかりません(そのため、現在、キャッシュを実行するラッパーがあります)。

SQLiteDatabaseオブジェクトがキャッシュされます。

このメソッドで 2 つの SQLiteDatabase インスタンスを作成し、1 つを閉じると、もう 1 つが開いたままになります。

が 1 つしかないと仮定すると、 「このメソッドで 2 つのインスタンスをSQLiteOpenHelper作成する」ことはできません。SQLiteDatabase2 番目の呼び出しは、最初の呼び出しgetWriteableDatabase()と同じものを返します。SQLiteDatabase

単一のコンポーネント (たとえば、1 つのアクティビティまたは 1 つのサービスのみ) からのみデータベースにアクセスしている場合は、そのコンポーネントが保持する 1 つSQLiteOpenHelper(ひいては 1 つだけ) を使用SQLiteDatabaseします。複数のコンポーネントからデータベースにアクセスしている場合は、シングルトンSQLiteOpenHelperインスタンスを使用する必要があります。直接、またはデータベースをContentProvider.

于 2012-05-26T18:22:32.597 に答える