编写一个Android平台遇到的所有问题(一)——查询sqlite数据库时遇到的问题
本人处于本科毕业阶段,毕业设计要做一个安卓平台,对于java还是小白的我确实有点难度,不过在做的过程中还是收获很多,现在希望把自己在这个过程中遇到的各个问题和朋友们分享,大神们不喜勿喷,由于毕业设计要做半年,所以接下来的这个系列差不多也要写将近半年吧,我尽量坚持。
下面就开始吧!!
一.查询sqlite数据库时遇到的问题
相必对于所有的Android开发者来说,sqlite一定不陌生,今天我第一次接触就被她虐了40分钟,真是惭愧。关于数据库的其他操作我就不多说了,大家一定都很清楚,我着重说一下在查询数据库时遇到的问题。
查询数据库一半我们用的都是cursor这个类,关于这个类我个人感觉她有点像C语言中的指针,用不好就出问题,被CursorIndexOutOfBoundsException虐过的人在心里默默的答一下到。一般来说这个问题都是你没有把cursor对象指向表的第一行。解决方法也很简单
Cursor c = db.query(table,columns,selection,selectionArgs,null,null,null); if(c.moveToFirst()) { //读数据代码 } else{ System.out.println("no record"); }
注:上述代码只是一个示例代码,没有写完全,特此说明,本人开始的时候也是看到网上的代码就直接拿过来用后来发现用不了才知道没写完全,以后我的代码除了完整的方法代码和程序代码,别的只作示例,如果大家想用(我有点厚脸皮,哈哈),还要自己添加一下。
继续回到正题,今天我遇到的问题是关于moveToFirst()和move(int offset)的配合使用,直接上代码说明:
public String queryData_query(SQLiteDatabase db,String table,String[]columns,String selection,String[] selectionArgs){ Cursor c = db.query(table,columns,selection,selectionArgs,null,null,null); //查询并获得游标 for(int i=0;i<c.getCount();i++) { if(c.moveToFirst()) //判断游标是否为空 { c.move(i); //移动到指定记录 username = c.getString(c.getColumnIndex("username")); System.out.println("query------->username="+username); } else{ System.out.println("no record"); break; } } c.close(); return username; }
move这个方法给我很大困扰,大家注意她的参数是offset,即偏移值,说明下一个cursor的位置=当前cursor的位置+offset,而不是网上有的地方说的代表表的某一行,而且要用这个方法的话就要保证起始地址不变,即保证c.moveToFirst()在每次变偏移值的时候都要执行一次,这个有点像单片机中基址+变址的寻址方式。