【问题标题】:Will an empty SQLite cursor return true for isBeforeFirst, isAfterLast, both, or neither?空 SQLite 游标是否会为 isBeforeFirst、isAfterLast、两者或都不返回 true?
【发布时间】:2014-10-05 10:32:47
【问题描述】:

这是一个非常简单的问题。我希望答案是“两者”,但我担心两者都不是。我已经仔细检查了 Android 开发者文档中的 SQLiteDatabaseCursor,但找不到这个问题的任何明确答案。

我要问的情况是我在哪里得到一个光标,调用moveToFirst,然后循环直到isAfterLast 返回true。如果光标有 0 条记录,我正在编码几次的模式可以正常工作并执行循环 0 次,这将非常方便。

或者我需要先显式测试空游标吗?

编辑:一些回复表明人们并没有完全理解我的要求。基本上,我想这样写:

cursor = myDb.query(...)
cursor.moveToFirst()
while (!cursor.isAfterLast()) {
    processRow(...)
}

但我不能 100% 确定我可以。 isAfterLast 不能返回任何有用的东西,但在这种情况下是 true,但这并不意味着它实际上对于空查询返回 true。除了getCount 之外,文档似乎没有指定大多数游标方法的返回值如果光标为空(实际上,Android 文档在很多极端情况下似乎并不具体)。所以我担心我需要这样做:

cursor = myDb.query(...)
if (cusror.getCount() > 0) {
    cursor.moveToFirst()
    while (!cursor.isAfterLast()) {
        processRow(...)
    }
}

这更混乱,逻辑上是多余的。请记住,在实际实现中有更多代码,并且分布在多个方法中。现在的答案之一是建议我还需要检查 null 的光标,这完全没有记录......

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

【问题讨论】:

  • 为什么不调用 cursor.getCount() 来知道 cursor 是否有项目。
  • 为此 if(Cursor != null) 尝试查找光标是否为空,然后您还可以像 Cursor.getCount() 一样检查光标的计数。如果没有记录,则返回 0。
  • @Ilango @user37 我知道如何检查光标是否有项目,问题是我是否可以避免这个检查。我有一些代码需要为查询结果的每一行运行一次,如果有 0 个结果,那么我想执行我的代码 0 次,即什么也不做。鉴于我有while(!cursor.isAfterLast()),如果isAfterLast 无论如何都会为空光标返回true,那么不必将整个东西包装在if 块中会更干净。
  • @Ben 我无法理解您的问题。而且我不明白你到底需要什么?
  • @Ilango 我为我的问题添加了更多解释,包括代码示例。

标签: android sqlite


【解决方案1】:

我不使用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 扩展而来的一个类

【讨论】:

  • 当查询返回 0 行时,你知道这有效吗(即只是跳过循环体,没有例外)?
  • 太棒了,谢谢。我接受了这个答案(即使我最初的问题的答案仍然是我真正想要的,因为isAfterLast/isBeforeFirst 允许我在需要时将前进到下一行与检查是否用尽分离)。
  • 谢谢!这样真的方便多了。
  • 但是 cursor.getXXX() 不会在没有行读取的情况下返回异常?
  • @Ben:我同意您的实际问题仍未得到解答。那么你有没有发现 isBeforeFirst() 返回 false 是否是检查空游标的可靠方法?
【解决方案2】:

当光标为空时,

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

所以是的,您发布的第一个代码 sn-p 可以在空光标上正常工作。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2011-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多