我是一个新手,编程,我发现这段代码在互联网上工作得很好
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(); }
部分代码不能正常工作。
对于文档SQLiteDatabase.query()说,查询方法返回:
“A光标对象,其被定位在所述第一条目之前”。
调用moveToFirst()
做两件事情:它可以让你测试查询是否返回一个空集(通过测试的返回值),它的光标移动到第一个结果(当设定不为空)。 请注意,谨防空回集,您发布的代码应该测试返回值(它不是做)。
不同于调用moveToFirst()
测试的if(c!=null)
是没有用的; query()
要么返回一个Cursor
对象,否则会抛出异常。 它永远不会返回null
。
if (c.moveToFirst()) {
while(!c.isAfterLast()) { // If you use c.moveToNext() here, you will bypass the first row, which is WRONG
...
c.moveToNext();
}
}
光标不是查询结果的行。 光标是一个对象,可以在您的查询的结果行迭代。 光标可以移动到每一行。 .moveToFirst()
方法将其移动到结果表的第一行。
moveToFirst()方法将光标移动到第一行。 它允许执行测试查询是否返回一个空集与否。 下面是其实现的一个样本,
if (cursor.getCount() == 0 || !cursor.moveToFirst()) {
return cursor.getLong(cursor.getColumnIndexOrThrow(ID_COLUMN));
cursor.close();
什么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(); 将导致没有记录返回。