2012-09-16 51 views
16

我是一個編程新手 的,我發現這段代碼在互聯網上工作得很好有什麼用moveToFirst()在SQLite的遊標

Cursor c=db.query(DataBase.TB_NAME, new String[] {DataBase.KEY_ROWID,DataBase.KEY_RATE}, DataBase.KEY_ROWID+"= 1", null, null, null, null); 
     if(c!=null) 
     { 
      c.moveToFirst(); 
     } 

,但我無法理解使用的

if(c!=null) 
    { 
     c.moveToFirst(); 
    } 

部分。它究竟做了什麼,如果我刪除

if(c!=null) { c.moveToFirst(); } 

部分,代碼不起作用。

回答

50

SQLiteDatabase.query()的文件說,該查詢方法返回:

「遊標對象,其被定位在第一項之前。」

調用moveToFirst()會做兩件事:它允許您測試查詢是否返回空集(通過測試返回值)並將光標移動到第一個結果(當集非空時)。請注意,爲防止空的返回集,您發佈的代碼應該測試返回值(它沒有執行的)。

與致電moveToFirst()不同,對if(c!=null)的測試是無用的; query()將返回Cursor對象,否則將引發異常。它永遠不會返回null

+0

很大,也感謝告訴我,'如果工作' – Aswin

+2

@Aswin(C!= NULL) - 完成。對null的測試是無用的。你可以把這個調用移到'if'之外的'moveToFirst()'並且去掉'if'。 –

+0

很好的解釋遊標和它的錯誤處理 – Zoombie

0

遊標不是查詢結果的行。遊標是一個可以遍歷查詢結果行的對象。光標可以移動到每一行。 .moveToFirst()方法將其移動到結果表的第一行。

8
if (c.moveToFirst()) { 
    while(!c.isAfterLast()) { // If you use c.moveToNext() here, you will bypass the first row, which is WRONG 
    ... 
    c.moveToNext(); 
    } 
} 
-1

macio.Jun說的是對的!

我們有像下面的代碼:

String sql = "select id,title,url,singer,view,info from cache where id=" + id; 
    SQLiteDatabase db = getMaintainer().getReadableDatabase(); 
    Cursor query = db.rawQuery(sql, null); 
    query.moveToFirst(); 
    while(query.moveToNext()){ 
     DBMusicData entity = new DBMusicData(); 
     entity.setId(query.getString(query.getColumnIndex(FIELD_ID))); 
     entity.setTitle(query.getString(query.getColumnIndex(FIELD_TITLE))); 
     entity.setSinger(query.getString(query.getColumnIndex(FIELD_SINGER))); 
     entity.setTitlepic(query.getString(query.getColumnIndex(FIELD_PICURL))); 
     entity.setInfoUrl(query.getString(query.getColumnIndex(FIELD_INFO))); 
     entity.setViews(query.getString(query.getColumnIndex(FIELD_VIEW))); 
     Log.w(tag, "cache:"+ entity.toString()); 
    } 
    query.close(); 
    query=null; 
    db.close(); 
    db=null; 

如果我們在高速緩存表中只有一條記錄,query.moveToFirst();將導致沒有記錄返回。

+0

請檢查邏輯錯誤:如果cursor.moveToNext返回true,則表示您處於第一條記錄。調用moveToNext將跳過您的第一行到下一行,您的第一行將永遠不會被訪問。在檢查moveToFirst返回true後,while循環將成爲do {} while()循環而不是while循環。 –

0

moveToFirst()方法將光標移動到第一行。它允許執行測試,無論查詢是否返回空集。下面是其實現的一個樣本,

if (cursor.getCount() == 0 || !cursor.moveToFirst()) { 

return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN)); 

cursor.close(); 
相關問題