Android: IllegalStateException: database already closed

本文探讨了在Android应用中使用SQLiteOpenHelper时遇到的IllegalStateException异常问题,详细分析了调用SQLiteDatabase.close()而非SQLiteOpenHelper.close()导致的问题,并提供了正确的数据库关闭方式。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

 

    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数据库时,在一个线程中打开数据库,在另一个线程中是可以将其关闭的。如果你的数据库操作中使用到了多线程。记得在打开和关闭数据库时加锁。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值