2012-09-16 21 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(); 
相关问题