本人處於本科畢業階段,畢業設計要做一個安卓平台,對於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()在每次變偏移值的時候都要執行一次,這個有點像單片機中基址+變址的尋址方式。