私は私のアプリをクラッシュした時間この迷惑なランタイムエラーを取得保管:いつSQLiteDatabaseオブジェクトを閉じるべきですか?
java.lang.RuntimeException: doInBackgroundを(実行中にエラーが発生しました)。 java.lang.IllegalStateException:によって引き起こさ
試み 再オープンに既に閉じたオブジェクト:いくつかのデバッグした後、私は
onDestory()
に、私は私のSQLiteDatabseオブジェクトをクローズするので、それが起こることがわかっ
をSQLiteDatabase方法。私はSQLiteOpenHelper.close()
と呼んでも起こります。
@Override
protected void onDestroy() {
super.onDestroy();
_cursor.close(); //is fine
_db.close(); //causes error
_databaseHelper.close(); //causes error too (probably calls db.close() internally..?)
SharedFunctions.d("closed!"); //ignore this ugly thing
}
これは、2つの質問
- が表示されます、私はそれが正しいでしょうか?
- の場合は、
onDestroy
メソッドではない場合、SQLiteDatabaseオブジェクトを閉じる必要がありますか?
編集: DBとヘルパークラスは、静的である:
//get database helper
if(_databaseHelper == null)
_databaseHelper = SalaryDatabaseHelper.getInstance(this);
db
がAsyncTask.doInBackground()
に初期化される:
public class MainActivity extends Activity {
private Cursor _cursor = null;
private MyCursorAdapter _myCursorAdapter = null;
private ListView _listView = null;
private static SalaryDatabaseHelper _databaseHelper = null;
public static SQLiteDatabase db = null;
...
IがのonCreateで_databaseHelper()メソッドを初期化します
protected Boolean doInBackground(Integer... data)
{
try {
//get writable database
if(db == null)
db = SalaryDatabaseHelper.getDbInstance();
Iヘルパークラスとデータベースクラスのシングルトン使用:(両方ともヘルパークラスを介してアクセス)
class MyDatabaseHelper extends SQLiteOpenHelper{
private static SalaryDatabaseHelper _instance = null;
private static SQLiteDatabase _dbInstance = null;
//singletons
public static synchronized SalaryDatabaseHelper getInstance(Context context)
{
// Use the application context, which will ensure that you
// don't accidentally leak an Activity's context.
if (_instance == null)
_instance = new SalaryDatabaseHelper(context.getApplicationContext());
return _instance;
}
public static synchronized SQLiteDatabase getDbInstance() {
if(_dbInstance == null)
_dbInstance = _instance.getWritableDatabase();
return _dbInstance;
}
...
「_db」とは何ですか? '_databaseHelper'とは何ですか?これらの規則的または静的なフィールドはありますか?この例外はどこで発生していますか? – CommonsWare
私はいくつかのコードを追加しました – Pilpel