、単一SQLiteOpenHelper
にclose()
経由(SQLiteデータベースを閉じるタイミングについては "修正進んでは" ありませんそれを使用している場合はclose()
をSQLiteDatabase
に設定してください)。
非常に難しく高速なルールは、複数のスレッドにわたって同じデータベースに対して複数のオブジェクトを同時に使用しないことです。あなた自身のスレッド同期をしていない限り、それはあなたを困らせます。データベースごとに1つのオブジェクトSQLiteDatabase
に固執すると、スレッド同期はSQLiteDatabase
の内部で処理されます。
スレッドごとに1つのルールがあるため、多くの場合、多くの異なるコンポーネントを使用しているときにスレッドが複雑になる可能性があります。シングルトンデータベースマネージャー。データベースを怠惰に開いて決して閉じません。たとえば、ContentProvider
が破壊されることはないため、データベースバックアップのContentProvider
はこのパターンを使用します。そのため、データベースをいつ閉じるか明確な時間はありません。
個人的には、特にAndroid用のSQLCipher(暗号化されたSQLiteの置き換え)を使用している場合、私はオープン・クローズ・アプローチでこのルートを使用します。ただし、一度に1つのスレッドしかデータベースで作業していないことが確かな場合は、オープン・クローズ・アプローチでは特に問題はありません。
データベースを使用するコンポーネントが1つだけの場合は、onCreate()
にデータベースを開き、onDestroy()
でデータベースを開くトリガーに間違いはありません。結局のところ、それがデータベースを必要とする唯一のコンポーネントであれば、コンポーネント自体がなくなるとデータベースは必要ありません。
onDestroyでデータベースを閉じます。コメント: "OnDestroy()は常に呼び出されません!onStop()を使用してください!" - >だから、ONSTART()、それを開くために持っている
onDestroy()
がコンポーネントに呼び出されません、どちらかあなたは、そのコンポーネントで未処理の例外でクラッシュした、またはあなたのプロセスが終了した場合、後者のシナリオです。 (プロバイダが破棄されないため、これはContentProvider
の仕組みでもあります)前のシナリオでは、間違って古いものを使用しない限り、問題はありません。SQLiteDatabase
と新しいSQLiteDatabase
を同時に使用します
dbは効率的に動作します。閉じる必要はありません。
効率の問題ではありません。 SQLiteはトランザクションです。データベースのクローズに失敗しても問題はありません。なぜなら、フラッシュされていないバッファや気になるものがないからです。
dbを一度開いて、フィールドとアクセサを作成します。
これは、データベースを閉じるときに直接関係することはありません。
使用後は閉じてください。
これはパターンであり、正常に動作します。
私のマントラは、それを開いて、それを使って、それを開いて、それを使って、それを開いて、それを使って、それを閉じる。私のトランザクションおよび/または単一のCRUD操作のすべてに適用されます。 –
ちょうどそれが2016なので、Android上のSqliteの使用が何か変更されたことを意味しません。 –
@ cricket_007そのロジックの後、それは十分に確立されているはずです。 – XxGoliathusxX