Android: IllegalStateException: database already closed
last modify:2013-11-18 11:20:36
*****************************************
打开一个Activity的时候通过SQLite查询一些数据并显示,出现一个异常:IllegalStateException。
stackoverflow:
java.lang.IllegalStateException: database /data/data/com***/databases/mobile.db (conn# 0) already closed
这是出错代码:
public ListgetList(Integer startIndex,Integer pageSize) {List resultList = new ArrayList ();SQLiteDatabase rdb = helper.getReadableDatabase();Cursor cursor = rdb.rawQuery("select number,name,model from blacklist order by _id desc limit ?,?", new String[]{startIndex+"",pageSize+""});while (cursor.moveToNext()) {String mNumber = cursor.getString(0);String mName = cursor.getString(1);Integer mModel = cursor.getInt(2);BlackNumber bNumber = new BlackNumber(mNumber, mName, mModel);resultList.add(bNumber);}cursor.close();rdb.close();//修改为:helper.close();就可了return resultList;}
原因:如果调用SQLiteDatabase.close()代替SQLiteOpenHelper.close()。那么SQLiteOpenHelper就不知道通过helper获取的DB是否是关闭的(getReadableDatabase或getWritableDatabase)。
补充:
1,SQLiteOpenHelper.close()是异步的,而SQLiteDatabase.close()不是。在多线程中要注意,所以养成好的面向对象的习惯,调用helper的close方法关闭数据库。(谁提供的数据,就调用谁的方法来操作数据)
2,在使用安卓提供的SQLiteOpenHelper时,通过getReadableDatabase或getWritableDatabase获得的其实是同一个对象,唯一的却别就是如果你的硬盘不足了,那么你就不能在调用getWritableDatabase,只能调用getReadableDatabase。
3,注意当多个线程操作SQLite数据库时,在一个线程中打开数据库,在另一个线程中是可以将其关闭的。如果你的数据库操作中使用到了多线程。记得在打开和关闭数据库时加锁。
更多相关文章
- Android(安卓)数据库升级 数据迁移 数据不丢失
- java CA证书相关操作,Android,java
- android 模拟listview多线程下载进度条显示不干扰
- android数据库事务操作详解
- android 驱动(6)---DTS 分析
- Android学习笔记(4)——Activity生命周期
- [android]_[handler的简单使用]
- Android源码阅读-Filter过滤器
- android handler 多线程