最近被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其他地方可以直接查询数据库,而不需要再次打开.