您的位置:首页 > 数据库

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

2013-04-27 21:07 453 查看
最近被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其他地方可以直接查询数据库,而不需要再次打开.
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐