`
wangjie2013
  • 浏览: 174163 次
  • 性别: 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
分享到:
评论

相关推荐

    java.lang.IllegalStateException: getOutputStream() has already解决办法

    纠结了半天的 java.lang.IllegalStateException: getOutputStream() has already。这个问题困扰了半天,在网上查阅了大量资料 出这个错误一般就是下面2个.....

    关于IllegalStateException: The specified child already has a parent.

    IllegalStateException: The specified child already has a parent.我的博客中有文章讲解

    java.lang.IllegalStateException: OutputStream already obtain

    标题 "java.lang.IllegalStateException: OutputStream already obtain" 涉及到的是Java编程中的一个常见错误,特别是当处理I/O流时。这个异常通常在尝试获取已经存在的OutputStream实例时抛出,表明该输出流已经被...

    Android异常 java.lang.IllegalStateException解决方法

    1. java.lang.IllegalStateException: No wrapped connection. 2.java.lang.IllegalStateException: Adapter is detached. 原因: 1.单线程一次执行一个请求可以正常执行,如果使用多线程,同时执行多个请求时就会...

    android: targetSdkVersion升级中Only fullscreen activities can request orientation问题的解决方法

    当`targetSdkVersion` 大于等于Android O(API level 26)时,如果活动不设置为全屏模式(即非`windowIsTranslucent`、`windowSwipeToDismiss` 或 `windowIsFloating`),并且尝试通过`setRequestedOrientation`方法...

    java.lang.IllegalStateException: Cannot call sendError() after the response has

    在Java的Web开发中,`java.lang.IllegalStateException: Cannot call sendError() after the response has been committed` 是一个常见的错误,通常发生在尝试在HTTP响应已经发送到客户端之后调用`sendError()`方法...

    尚学堂android开发常用错误集.docx

    01-16 22:18:39.222:E/AndroidHttpClient(26745): java.lang.IllegalStateException: AndroidHttpClient created and never closed ``` **原因分析**: 此错误表明`AndroidHttpClient`对象创建后未曾被正确关闭。`...

    powerbuilder

    ### PowerBuilder 中从 Excel 导入数据到 DataWindow 的实现方法 #### 标题解析: 在 PowerBuilder 开发环境中,经常需要将外部数据源(如 Excel 文件)中的数据导入到程序内部的数据展示组件(DataWindow)中进行...

    Android开发之ViewSwitcher用法实例

    如代码所示,当尝试向ViewSwitcher中添加第三个View时,它会抛出一个`IllegalStateException`,提示“Can’t add more than 2 views to a ViewSwitcher”。这意味着ViewSwitcher只能管理最多两个子View,这是它的一...

    ListView后台更新报错:java.lang.IllegalStateException

    java.lang.IllegalStateException: The content of the adapter has changed but ListView did not receive a notification. Make sure the content of your adapter is not modified from a background thread, but...

    java dubbo admin 2.5.3 + jdk1.7

    java dubbo admin 2.5.3 + jdk 1.7 亲试 好用 ... java.lang.IllegalStateException: BeanFactory not initialized or already closed - call 'refresh' before accessing beans via the ApplicationContext

    android调用摄像机录像简单版

    在Android平台上,调用摄像机进行录像是一项常见的功能,尤其对于开发移动应用的初学者来说,理解并实现这一功能至关重要。下面将详细讲解如何在Android中实现简单的录像功能。 首先,你需要在AndroidManifest.xml...

    android如何设置Activity背景色为透明色

    * 如果继承自 AppCompatActivity,将会报错,例如:java.lang.IllegalStateException: You need to use a Theme.AppCompat theme (or descendant) with this activity。 解决方法是将 Activity 继承自 Activity,...

    Android MediaRecorder后台自动录视频

    8. **异常处理**:在使用MediaRecorder时,要捕获并处理可能的IOException、IllegalStateException和RuntimeException。 9. **释放资源**:录制完成后,记得调用`release()`方法释放MediaRecorder对象,防止内存...

    Android开发之MediaPlayer基本使用方法详解

    } catch (IllegalStateException e) { e.printStackTrace(); } catch (IOException e) { e.printStackTrace(); } mp.setOnCompletionListener(new OnCompletionListener() { @Override public void on...

    LoadingLayoutDemo-加载中、无网络、无数据、出错4种状态的载入布局.zip

    (2)为了方便管理,LoadingLayout只能有一个直属子View,类似ScrollView,添加两个直属子View会抛出异常throw new IllegalStateException("LoadingLayout can host only one direct child");; (3)由于AS会直接...

    android 视频录制 并保存到本地

    在这个过程中,确保你的应用程序已经处理了所有可能抛出的异常,如`IOException`和`IllegalStateException`。 3. **停止录制**: 当需要停止录制时,调用`stop()`方法。注意,`stop()`可能会抛出`RuntimeException...

    android开发常用错误集归类.pdf

    4. **IllegalStateException:Activity已启动**: 这个错误通常发生在尝试操作一个已经启动的Fragment时,例如在FragmentTransaction中添加或移除Fragment。错误堆栈跟踪可能指向`FragmentTransaction`的错误使用。...

Global site tag (gtag.js) - Google Analytics