这是一个非常直截了当的问题。我希望答案是“两个”,但我担心它们都不是。我仔细检查了SQLiteDatabase和Cursor的Android开发人员文档,但找不到这个问题的任何明确答案。
我问的是我得到光标的地方,调用moveToFirst
,然后循环直到isAfterLast
返回true。对于我正在编码几次的模式来说非常方便,如果光标有0条记录,那么它只会工作并执行循环0次。
或者我是否需要先显式测试空光标?
编辑:有些回复表明人们并没有得到我所要求的东西。基本上,我想写这个:
cursor = myDb.query(...)
cursor.moveToFirst()
while (!cursor.isAfterLast()) {
processRow(...)
}
但我并非100%确定我能做到。 isAfterLast
无法返回任何有用的,但对于这种情况确实如此,但这并不意味着它实际上对于空查询返回true。文档似乎没有指定大多数游标方法的返回值,如果游标为空(Android文档在很多极端情况下似乎都不是特定的),而不是getCount
。所以我担心我需要这样做:
cursor = myDb.query(...)
if (cusror.getCount() > 0) {
cursor.moveToFirst()
while (!cursor.isAfterLast()) {
processRow(...)
}
}
这更加混乱,逻辑冗余。请记住,在实际实现中有更多的代码,这是跨多种方法的。其中一个答案现在建议我也需要检查null
的光标,这完全没有文档...
我只是想知道在空光标上调用时是否有其他人知道isAfterLast
的实际行为。
答案 0 :(得分:6)
我不使用isAfterLast
。我使用以下模式来读取查询结果。
SQLiteDatabase db = new DbHelper().getWritableDatabase();
String sql = "SELECT ...";
String[] args = ...;
Cursor cs = db.rawQuery(sql, args);
while (cs.moveToNext()) {
// cs.getXxx(0), cs.getXxx(1)
}
cs.close();
db.close();
DbHelper
是我从SQLiteOpenHelper
答案 1 :(得分:6)
当光标为空时,
cursor.moveToFirst()返回false
cursor.isBeforeFirst()返回true
cursor.isAfterLast()返回true
所以,是的,你发布的第一个代码片段在空光标上工作正常。