データベース関連のアプリを実装しています。
挿入、更新、および削除のために、データベース接続のオープンとクローズを何度も呼び出しています。
正常に動作しています。
しかし、さまざまな状況でデータベースが開かれていないという例外が発生することがあります。
これらの問題を解決するにはどうすればよいですか?
あなたが提供した情報に基づいて、問題はあなたのビジネスロジックにあり、誰にも問題はないと推測できますが、根本的な原因を教えてくれるはずです. ここにコードがないと、正確な場所を示すことができません。考えられる理由の 1 つは、ビジネス ロジックによって、閉じたデータベースに対して何らかの操作 (挿入、更新など) を実行しようとしている可能性があります。
DB が必要なときに常に開いていることを確認するために、いくつかの回避策を実行できます。いわゆる遅延初期化アプローチを使用してデータベース getter メソッドを実装すると、アクセスする必要があるときに DB が開いていることが少なくとも保証されます。
これが私が話していることです:1. DBオブジェクトを返すはずのパブリックメソッドを作成します:
public SQLiteDatabase getDB() {
if ((mDataBase == null) || (!mDataBase.isOpen())) {
// create or open your database using an OpenHelper
mDataBase = SQLiteOpenHelper.getWritableDatabase();
}
return mDataBase;
}
これで、コードのどこでも、変数 mDataBase に直接アクセスする代わりに、このメソッドを使用して DB にアクセスできます。
コードはアイデアを提供するためのものであり、実際にはコンパイルできないことに注意してください。それでも、この回避策を使用する代わりに、ビジネス ロジックを修正することをお勧めします。
適切な例外処理を行わない限り、何が原因であるかはわかりません。
ただし、Android で SQL Light 用の優れた ORM マッパーを採用することをお勧めします。これにより、データベースの相互作用と例外処理が改善され、データベースを効率的に開閉できます。
必要に応じて、 SUGARまたはORMLightを選択できます。私の意見では、これは問題の解決に役立つはずです。