【发布时间】:2014-10-05 10:32:47
【问题描述】:
这是一个非常简单的问题。我希望答案是“两者”,但我担心两者都不是。我已经仔细检查了 Android 开发者文档中的 SQLiteDatabase 和 Cursor,但找不到这个问题的任何明确答案。
我要问的情况是我在哪里得到一个光标,调用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 我为我的问题添加了更多解释,包括代码示例。