一个空的SQLite游标是否会为isBeforeFirst,isAfterLast,两者或两者都返回true?

Ben*_*Ben 6 sqlite android

这是一个非常直截了当的问题.我希望答案是"两个",但我担心它们都不是.我仔细检查了SQL开发人员和Cursor的Android开发人员文档,但找不到这个问题的任何明确答案.

我问的情况是我得到一个游标,调用moveToFirst,然后循环,直到isAfterLast返回true.对于我正在编码几次的模式来说非常方便,如果光标有0条记录就可以正常工作并执行循环0次.

或者我是否需要先显式测试空光标?

编辑:一些回复表明人们并没有得到我所要求的.基本上,我想写这个:

cursor = myDb.query(...)
cursor.moveToFirst()
while (!cursor.isAfterLast()) {
    processRow(...)
}
Run Code Online (Sandbox Code Playgroud)

但我并不是100%肯定我能.对于这种情况,isAfterLast不能返回任何有用但真实的东西,但这并不意味着它实际上对于空查询返回true.该文档似乎并不指定哪些大部分的光标方法的返回值是如果光标是空的(Android的文档似乎非特异性的很多角落的情况下,实际上)比其他getCount.所以我担心我需要这样做:

cursor = myDb.query(...)
if (cusror.getCount() > 0) {
    cursor.moveToFirst()
    while (!cursor.isAfterLast()) {
        processRow(...)
    }
}
Run Code Online (Sandbox Code Playgroud)

这更加混乱,逻辑冗余.请记住,在实际实现中有更多的代码,这是跨多种方法的.其中一个答案现在建议我也需要检查光标null,这完全没有文档...

我只是想知道是否有其他人知道在isAfterLast空光标上调用时的实际行为.

wan*_*nik 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();
Run Code Online (Sandbox Code Playgroud)

DbHelper 是一个我延伸的课程 SQLiteOpenHelper


Sil*_*yte 6

当光标为空时

cursor.moveToFirst()返回false
cursor.isBeforeFirst()返回true
cursor.isAfterLast()返回true

所以是的,你发布的第一个代码片段在空光标上工作正常.