使用SQLiteDataBase 关闭游标关闭数据库及NullPointer问题总结

本文总结了使用SQLiteDataBase时遇到的NullPointer问题,强调了在读取数据后及时关闭游标和数据库的重要性。在一般情况下,应在读取完Cursor数据后立即关闭。然而,当Cursor用于ListView并响应OnItemClickListener时,应当由Activity托管游标并在onDestroy()中关闭数据库。详细阐述了Android Activity的生命周期,以便于理解何时关闭资源。

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

最近被SQLiteDataBase的nullpointer问题弄得晕头转向,现在捋下原因

一般说来,打开数据库查询数据,得到的cursor很容易出错,得到数据后要马上关掉游标和数据库,但也有例外,

则交给activity去托管游标,利用acitvity的生命周期去关闭数据库.


-------一般的用法------


 用Cursor cr=db.query(String table, String[] columns, String selection, String[] selectionArgs, String groupBy, String having, String orderBy)访问些列某行的数据.


eg: String DATABASE_NAME="sql.db";

      String TABLE_NAME="consitems";

      String[] queryColumns={"finishflag"};

      String[] args={"2345"};

      SQLiteDataBase db=openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);

     try{

      Cursor cr=db.query(TABLE_NAME,queryColumns,"cons_no=?",args,null,null,null);

      if(c.moveToFirst()){//防止出nullpointer 错误
do{
String status=cr.getString(cr.getColumnIndex("finishflag"));
System.out.println("status:"+status);
}while(c.moveToNext());
      }

     if(cr!=null)

         cr.close();

   }catch(SQLiteException e){
e.printStackTrace();
   }

   if(db!=null){

       db.close();

   }

  在通过游标读取完数据保存后,要关掉游标,关掉数据库.

---------特殊情况---------

然而有的时候,当用cursor显示listview,listview 的items响应OnItemClickListener事件时,不能马上关掉游标和数据库,否则将不能显示,只能把cursor交给activity托管,把db.close()交给activity ondestroy 中

---------------------------------------Acitivity生命周期---------------------------------

1、Android手机有HOME键和返回键。在按下HOME键之后,当前应用会退回到桌面。此时生命周期执行过程是**onPause()-->onStop();** Activity处于Stoped状态。
2、若返回键功能没有被重写,在按下返回键之后,当前Activity会退出,执行生命周期**onPause()-->onStop()-->onDestroy()**;Activity处于Killed状态,当前Activity已经被销毁。
3、若从Activity1跳转到Activity2,那么只会执行onPause()-->onStop();前一个Activity被存在栈中,处于Stoped状态。
4、什么时候会处于Paused状态呢,Activity在完全看不到的状态下,会处于Stoped状态,如1、3。
但是Activity在某个Activity下,但是没有被完全挡住时,只会执行onPause(),处于Paused状态,这种情况发生在情况3中Activity是以Dialog形式跳转的时候。
5、Activity恢复过程,onPause()是直接恢复到onResume(),onStop()状态是恢复到onStart(),然后执行onResume()。Activity处于running状态。

--------------------------------------------------------------------------------------------------------------------

eg:

SQLiteDataBase db=null;//定义全局变量

String[] parms={"工单号",mtask_no};

String[] queryColumns={"_id","cons_no","cons_name","cons_address","rtua",
"meter_code","faultCode","longitude","latitude"};

db=openOrCreateDatabase(DATABASE_NAME, MODE_PRIVATE, null);
Cursor cr = db.query(CONS_TABLE, queryColumns, "task_no=? or task_no=?", parms, null, null, null); 
//寻找行号"工单号" mtask_no,列号queryColumns的数据
ListAdapter adapter2 = new MySimpleCursorAdapter(this, R.layout.conslistitems, cr, ColumnNames2, ConID); 
conslv.setAdapter(adapter2);         
startManagingCursor(cr);
conslv.setOnItemClickListener(ItemClickListener);

@Override
protected void onDestroy() {
// TODO Auto-generated method stub
super.onDestroy();
if(db!=null)
db.close();
}

该acitivity其他地方可以直接查询数据库,而不需要再次打开.

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值