`
wangjie2013
  • 浏览: 172713 次
  • 性别: Icon_minigender_1
  • 来自: 北京
社区版块
存档分类
最新评论

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 List<BlackNumber> getList(Integer startIndex,Integer pageSize) {
		List<BlackNumber> resultList = new ArrayList<BlackNumber>();
		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数据库时,在一个线程中打开数据库,在另一个线程中是可以将其关闭的。如果你的数据库操作中使用到了多线程。记得在打开和关闭数据库时加锁。

1
0
分享到:
评论

相关推荐

Global site tag (gtag.js) - Google Analytics