阅读更多

 

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

更多相关文章

  1. Android(安卓)数据库升级 数据迁移 数据不丢失
  2. java CA证书相关操作,Android,java
  3. android 模拟listview多线程下载进度条显示不干扰
  4. android数据库事务操作详解
  5. android 驱动(6)---DTS 分析
  6. Android学习笔记(4)——Activity生命周期
  7. [android]_[handler的简单使用]
  8. Android源码阅读-Filter过滤器
  9. android handler 多线程

随机推荐

  1. [置顶] 我的Android进阶之旅------>Andro
  2. Android架构分析之Android驱动程序开发
  3. 《Android攻防实战》读书笔记——Android
  4. android新闻App源码、仿微信源码、地图音
  5. Android:TextView属性
  6. Android工具箱之文件目录
  7. 在程序中设置android:gravity 和 android
  8. Android(安卓)软件安装方法介绍
  9. C#开发Android应用的必备——Mono for An
  10. android shape控件的使用