5

概要: onStart および async タスクでデータベース接続を開くことは、非常に複雑になっています。グローバルに利用可能なデータベース接続を持つことは悪い習慣ですか? それが悪い場合、より良い方法は何ですか?

詳細: いくつかのアクティビティで sqlite3 データベースに接続するアプリケーションがあります。最初は、データベースにアクセスする必要がある場所があまりなかったので、アクセスするたびに開いたり閉じたりしていました。次に、それにアクセスする必要がある場所がさらにあったため、別のスタック オーバーフローの質問で示唆されているように、接続が必要なアクティビティの onStart メソッドでデータベース接続を開き、onStop メソッドで閉じました。

これは、アクティビティが終了した非同期タスクで接続が必要になるまではうまくいきました。アクティビティの onStop メソッドが呼び出されて接続が閉じられたため、非同期タスクがデータベースにアクセスしようとしたときには失敗していました。解決策として、onPreExecute メソッドで開かれ、onPostExecute メソッドで閉じられた非同期タスクごとに個別の接続を作成しました。

これにより、多くの接続の開閉が発生しました。アプリケーションコンテキストでグローバルに利用可能なデータベース接続を作成するのが良い考えかどうか疑問に思っています. それは間違いなく多くのコードをクリーンアップし、接続を閉じるのを忘れた場合やアプリが強制的に閉じられた場合に発生している閉じられていないデータベース例外を削除します. 他の誰かがこれを試しましたか/このアプローチに問題がありますか?

4

2 に答える 2

2

数週間前に同様の問題に遭遇しました。SQLite db に永続性を持ついくつかのクラスを使用します。

アクティビティを永続性から切り離したかったので、永続性が必要なアクティビティ用に静的内部クラス (マネージャーと呼ばれる) を作成しました。マネージャーをインスタンス化するたびに、データベース接続が作成され、マネージャーを使用した後、明示的に閉じます。テーブルにアクセスするグローバル マネージャーがあった場合、それらは同時実行のために同期する必要があり、これらのデータベース接続をいつ閉じる必要があるかわかりません。だから私はこのようにしました。

お役に立てれば!

于 2012-04-12T19:43:22.017 に答える