2016-08-20 3 views
3

私はStackOverflowについて多くの議論を読んでいます。インターネット上の多くのWebサイトでは、多くの議論を読んでいます。いつsqliteデータベースを開いて閉じるべきですか? 私はさまざまな時期からさまざまな反応と推測を読んでいます。 最後に私は以前よりも混乱しています。どのような人々が提案さ:Android Open and Close Database

  1. はonDestroy() コメントであなたのデシベルを閉じます: "OnDestroy()が常に呼び出されません使用onStop()!" - >だからonStart()はそれを開く必要があります。

  2. dbは効率的に機能します。それを閉じる必要はありません。

  3. dbを一度開いて、フィールドとアクセサを作成します。

  4. 使用後は閉じてください。

そして、もっと多くの...

それでは、2016年に正しい進むのか? Plsは推測しません!

Examplelinks:コンピュータプログラミングで物事の多くと同様に

Android: opening and closing SQLite database

Android Closing database

+1

私のマントラは、それを開いて、それを使って、それを開いて、それを使って、それを開いて、それを使って、それを閉じる。私のトランザクションおよび/または単一のCRUD操作のすべてに適用されます。 –

+1

ちょうどそれが2016なので、Android上のSqliteの使用が何か変更されたことを意味しません。 –

+0

@ cricket_007そのロジックの後、それは十分に確立されているはずです。 – XxGoliathusxX

答えて

6

、単一SQLiteOpenHelperclose()経由(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を一度開いて、フィールドとアクセサを作成します。

これは、データベースを閉じるときに直接関係することはありません。

使用後は閉じてください。

これはパターンであり、正常に動作します。

+0

まずこの詳細な回答に感謝します!私はすべての私の活動に同じデータベースとImでマルチスレッドを使用していないので、onDestroy()バージョンのonstart()バージョンが最適です。 – XxGoliathusxX

+1

@XxGoliathusxX: "マルチスレッドを使用していない" - あなたは本当に**バックグラウンドスレッドでデータベースアクセスを行う必要があります。ディスクI/O、ネットワークI/O、またはメインアプリケーションスレッドのその他の低速作業は、その作業が完了するまでUIがフリーズされるので、行わないでください。 – CommonsWare

+0

どうすればいいのかわかりません。私に良いチュートリアルをリンクできますか? – XxGoliathusxX