使用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其他地方可以直接查询数据库,而不需要再次打开.
一般说来,打开数据库查询数据,得到的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其他地方可以直接查询数据库,而不需要再次打开.
相关文章推荐
- iphone xcode 使用database 数据库 sqlite3的使用注意项总结
- iphone xcode 使用database 数据库 sqlite3的使用注意项总结
- 使用SQLite附加(ATTACH)数据库时,需要注意数据文件编码的问题
- 使用 SQLiteDatabase 操作 SQLite 数据库
- Android 高手进阶教程(十二)----Android数据库SQLiteDatabase的使用!!
- Cocos2d-x 3.2 Lua项目通过LuaSQLite3使用Sqlite3问题总结
- Android SQLiteDatabase数据库的总结
- 解决使用cmd或powershell进行数据库(MySQL,SQLite3...)查询时中文乱码的问题
- 使用FMDB多线程访问数据库,及database is locked的问题
- 【数据库】SQLITE3 使用总结2
- Android中SQLite数据库操作(2)——使用SQLiteDatabase提供的方法操作数据库
- Android数据库SQLite的使用详解(SQLiteOpenHelper,SQLiteDataBase)【看后面简约进阶版】access中数据库拷贝到本地
- 删除数据库时提示数据库正在被使用,无法删除(Cannot drop database databasename because it is currently in use)的问题
- 使用FMDB多线程访问数据库,及database is locked的问题
- Android 高手进阶教程(十三)之----Android 数据库SQLiteDatabase的使用!
- Android 高手进阶教程(十三)之----Android 数据库SQLiteDatabase的使用!
- Android 高手进阶教程(十三)之----Android 数据库SQLiteDatabase的使用!!
- 使用FMDB多线程访问数据库 及databaseislocked的问题
- Android数据库(SQLiteDatabase)使用小结 .
- Android 高手进阶教程(十三)之----Android 数据库SQLiteDatabase的使用!