我是一名编程新手 我在互联网上找到了这段代码并且工作正常
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(); }
部分,代码不起作用。
答案 0 :(得分:55)
SQLiteDatabase.query()的文档说查询方法返回:
“一个Cursor对象,位于第一个条目之前。”
调用moveToFirst()
会做两件事:它允许您测试查询是否返回空集(通过测试返回值)并将光标移动到第一个结果(当集合不为空时)。请注意,为了防止空返回集,您发布的代码应该测试返回值(它没有这样做)。
与调用moveToFirst()
不同,if(c!=null)
的测试无用; query()
将返回Cursor
对象,否则将抛出异常。它永远不会返回null
。
答案 1 :(得分:9)
if (c.moveToFirst()) {
while(!c.isAfterLast()) { // If you use c.moveToNext() here, you will bypass the first row, which is WRONG
...
c.moveToNext();
}
}
答案 2 :(得分:0)
Cursor不是查询结果的行。 Cursor是一个可以迭代查询结果行的对象。光标可以移动到每一行。 .moveToFirst()
方法将其移动到结果表的第一行。
答案 3 :(得分:0)
moveToFirst()方法将光标移动到第一行。它允许执行测试查询是否返回空集。以下是其实施的示例,
if (cursor.getCount() == 0 || !cursor.moveToFirst()) {
return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN));
cursor.close();
答案 4 :(得分:-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(); 将导致没有记录返回。