【发布时间】:2017-06-16 07:51:54
【问题描述】:
我一直收到这个烦人的运行时错误几个小时,这导致我的应用程序崩溃:
java.lang.RuntimeException: 执行时出错 doInBackground().
引起:java.lang.IllegalStateException:尝试 重新打开一个已经关闭的对象:SQLiteDatabase
经过一些调试后,我发现这是因为我在 onDestory() 方法中关闭了我的 SQLiteDatabse 对象。当我打电话给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
}
这就引出了两个问题
- 我做得对吗? (可能不会)
- 如果
onDestroy方法中没有,我是否需要关闭 SQLiteDatabase 对象?
编辑: DB 和 Helper 类是静态的:
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;
...
我在 onCreate() 方法中初始化 _databaseHelper:
//get database helper
if(_databaseHelper == null)
_databaseHelper = SalaryDatabaseHelper.getInstance(this);
db 在 AsyncTask.doInBackground() 中初始化:
protected Boolean doInBackground(Integer... data)
{
try {
//get writable database
if(db == null)
db = SalaryDatabaseHelper.getDbInstance();
我对助手类和数据库类使用单例:(都通过助手类访问)
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是什么?这些是常规字段还是static字段?这个异常是在哪里引发的? -
我添加了一些代码
标签: android