我正在尝试从数据库中删除某些内容然后插入新值。我对数据库知之甚少,所以希望了解这里出了什么问题。
我一直收到以下错误:
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);
}
答案 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();