尝试重新打开已关闭的对象:SQLiteDatabase:

时间:2013-09-26 17:09:19

标签: android sqlite

我正在尝试从数据库中删除某些内容然后插入新值。我对数据库知之甚少,所以希望了解这里出了什么问题。

我一直收到以下错误:

Caused by: java.lang.IllegalStateException: attempt to re-open an already-closed object: SQLiteDatabase:

从异步任务调用,第一次正常工作,但第二次触发任务时中断。

以下是重要的片段:

 public void removeAndInsert(String configRaw) {
    SQLiteDatabase sqlite = null;
    try {
        sqlite = dbHelper.getWritableDatabase();
        removeAndInsert(configRaw, sqlite);
    .....
    finally {
        if (sqlite != null) {
            sqlite.close();
        }
    }



void removeAndInsert(String configRaw, SQLiteDatabase sqlite) throws SQLException {
    ContentValues initialValues = new ContentValues();
    initialValues.put(DBOpenHelper.CONFIG_CACHE_RAW_DATA, configRaw);
    sqlite.delete(DBOpenHelper.CONFIG_CACHE_TABLE_NAME, null, null);
    sqlite.insert(DBOpenHelper.CONFIG_CACHE_TABLE_NAME, null, initialValues);
}

3 个答案:

答案 0 :(得分:12)

试试这个。

public void removeAndInsert(String configRaw) {
  SQLiteDatabase sqlite = null;
  try {
    sqlite = dbHelper.getWritableDatabase();
    synchronized(sqlite) {
      removeAndInsert(configRaw, sqlite);
    }
  .....
    finally {
    if (sqlite != null && sqlite.isOpen()) {
        sqlite.close();
    }
}

void removeAndInsert(String configRaw, SQLiteDatabase sqlite) throws SQLException {
  ContentValues initialValues = new ContentValues();
  initialValues.put(DBOpenHelper.CONFIG_CACHE_RAW_DATA, configRaw);
  sqlite.delete(DBOpenHelper.CONFIG_CACHE_TABLE_NAME, null, null);
  sqlite.insert(DBOpenHelper.CONFIG_CACHE_TABLE_NAME, null, initialValues);
}

答案 1 :(得分:8)

看起来你正在某处创建一个SQLiteOpenHelper实例(dbHelper)并从中获取一个可写数据库(sqlite),然后关闭数据库。如果这是打开的最后一个(或唯一)数据库引用,则在您调用sqlite.close()时将关闭整个数据库。

您可以安全地删除sqlite.close()中对removeAndInsert()的来电。当您的AsyncTask完成其数据库工作后,请调用dbHelper.close()以清理任何悬空数据库引用。

答案 2 :(得分:3)

尝试将sqlite.close();替换为dbHelper.close();